java - 替换正则表达式中的 Group2

标签 java regex

我有以下文字

    ABCDEF
     JHJHJNJN<098978686
     <jjg>
    HGHJFGV XXXX    
       10-10-2018
    JHKGHKGHG
        JKHJHHJM
10-10-2019 JGHHGHGVH
HBVJHBHBB

我想替换日期后跟 XXX+空格数 这是我的代码

public class Regexreplace {

    public static void main(String[] args){

        String inp = "    ABCDEF"
                     +" JHJHJNJN<098978686"
                     +"     <jjg>         "
                     +" HGHJFGV XXXX     "
                     +"     10-10-2018  "
                     +" JHKGHKGHG  "
                     +"     JKHJHHJM"
                     +"     10-10-2019 JGHHGHGVH"
                     +" HBVJHBHB    ";
        String ipRegex = "(XXXX.*)[\\s]+([\\d]{1,2}-[\\d]{1,2}-[\\d]{4})";

        System.out.println(inp.replaceAll(ipRegex, "$110-11-2018"));

    }

}

输出:

ABCDEF  JHJHJNJN<098978686      <jjg>           HGHJFGV XXXX            10-10-2018      JHKGHKGHG       JKHJHHJM    10-11-2018 JGHHGHGVH    HBVJHBHB

为什么要替换文本中的第二个日期?

最佳答案

它正在替换第二个日期,因为您的正则表达式中有一个贪婪的“匹配任何内容”序列:

"(XXXX.*)[\\s]+([\\d]{1,2}-[\\d]{1,2}-[\\d]{4})"
//    ^^
//   Here

this question 的答复解释贪婪和非贪婪(惰性)量词之间的区别。简而言之:

The standard quantifiers in regular expressions are greedy, meaning they match as much as they can, only giving back as necessary to match the remainder of the regex.

对于您的输入,这意味着 .* 序列将匹配包含第二个日期的行之前的所有内容。

由于您不需要“匹配任何内容”,一种解决方案是完全删除贪婪序列,并将空白匹配序列引入捕获组中:

"(XXXX\\s+)(\\d{1,2}-\\d{1,2}-\\d{4})"

注意:无需将 \\d\\s 放入字符类中 ([\\s])。

关于java - 替换正则表达式中的 Group2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52885042/

相关文章:

java - println(String) 接口(interface)

java - NotADirectoryError:[Errno 20]不是目录:'java'

python - re.split 没有给出正则表达式的最后一个字符

PHP - 检查 2 个以逗号分隔的整数中的前导 0

javascript - 为什么我的 javascript regex.test() 会给出交替的结果

java - 使用 JPanels/JFrames 显示?

java - 按钮点击错误...找不到方法

java - 在 Java 方法中传递和使用 Class

php - preg_match 或运算符

单行上的python正则表达式语句