我有一个只有一组的正则表达式模式。我需要在输入字符串中找到符合模式的文本,并仅替换匹配组 1。例如,我有正则表达式模式和要应用的字符串,如下所示。替换字符串是“<---->”
Pattern p = Pattern.compile("\\w*(lan)\\w+");
Matcher m = p.matcher("plan plans lander planitia");
预期的结果是
plan p<--->s <--->der p<--->itia
我尝试了以下方法
String test = "plan plans lander planitia";
Pattern p = Pattern.compile("\\w*(lan)\\w+");
Matcher m = p.matcher(test);
String result = "";
while(m.find()){
result = test.replaceAll(m.group(1),"<--->");
}
System.out.print(result);
结果为
p<---> p<--->s <--->der p<--->itia
另一种方法
String test = "plan plans lander planitia";
Pattern p = Pattern.compile("\\w*(lan)\\w+");
Matcher m = p.matcher(test);
String result = "";
while(m.find()){
result = test.replaceAll("\\w*(lan)\\w+","<--->");
}
System.out.print(result);
结果是
plan <---> <---> <--->
我已经经历了this关联。这里匹配之前的字符串部分始终不变并且是“foo”但在我的情况下它会有所不同。我也看过 this和 this但我无法将任何解决方案应用到我当前的场景中。
感谢任何帮助
最佳答案
您需要将以下模式与捕获组一起使用:
(\w*)lan(\w+)
^-1-^ ^-2-^
并替换为$1<--->$2
参见 regex demo
重点是我们在想要保留的部分周围使用捕获组,并只匹配我们想要丢弃的部分。
String str = "plan plans lander planitia";
System.out.println(str.replaceAll("(\\w*)lan(\\w+)", "$1<--->$2"));
// => plan p<--->s <--->der p<--->itia
如果您需要能够替换第 1 组并保留其余部分,您可以使用 Matcher#appendReplacement
的替换回调方法模拟。 :
String text = "plan plans lander planitia";
String pattern = "\\w*(lan)\\w+";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(text);
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, m.group(0).replaceFirst(Pattern.quote(m.group(1)), "<--->"));
}
m.appendTail(sb); // append the rest of the contents
System.out.println(sb.toString());
// output => plan p<--->s <--->der p<--->itia
在这里,由于我们逐场处理,我们应该只用 replaceFirst
替换第 1 组的内容一次,并且由于我们将子字符串替换为文字,所以我们应该 Pattern.quote
关于java - 替换 Java 正则表达式的第 1 组而不替换整个正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38296673/