我有以下文字
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/