有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用replaceall()删除任何与模式不匹配的字符串

我需要用""替换所有不遵循模式的字符

我有这样的字符串:

MCC-QX-1081
TEF-CO-QX-4949
SPARE-QX-4500

到目前为止,我正在使用下面的正则表达式

String regex = "[^QX,-,\\d]";

使用replaceAllString方法,我得到QX1081,预期结果是QX-1081


共 (3) 个答案

  1. # 1 楼答案

    您使用的字符类要么转义连字符,要么将其放在开头或结尾,比如[^QX,\d-],否则您将匹配从逗号到逗号的范围。但是改变这一点会给你带来-QX-1081,这并不是你想要的结果

    您可以匹配您的模式,然后替换为第一个捕获组^{

    ^(?:[A-Z]+-)+(QX-\d+)$
    

    在Java中,必须对匹配的数字进行双转义\\d

    这将匹配:

    • ^字符串的开头
    • (?:[A-Z]+-)+重复1+次一个或多个大写字符,后跟连字符
    • (QX-\d+)在组中捕获QX-后跟1+个数字
    • $字符串的结尾

    例如:

    String result = "MCC-QX-1081".replaceAll("^(?:[A-Z]+-)+(QX-\\d+)$", "$1");
    System.out.println(result); // QX-1081  
    

    Regex demo| Java demo

    请注意,如果只进行一次替换,也可以使用replaceFirst

  2. # 2 楼答案

    将破折号放在正则表达式的末尾:[^QX,\d-] 接下来,只需使用子字符串过滤掉第一个破折号。 不知道所有字符串的确切期望值,但如果要匹配字符类中的破折号,则必须将其设置为最后一个字符

  3. # 3 楼答案

    您使用的character class匹配单个字符,而不是模式

    你想要什么

    String resultString = subjectString.replaceAll("^.*?(QX-\\d+)?$", "$1");
    

    只要字符串中的QX-digits部分后面没有任何内容,它就可以工作