我有一个只有一个组的正则表达式模式.我需要在模式后面的输入字符串中查找文本并仅替换匹配组1.例如,我有正则表达式模式和要应用的字符串,如下所示.替换字符串是"<---->"
Pattern p = Pattern.compile("\\w*(lan)\\w+");
Matcher m = p.matcher("plan plans lander planitia");
Run Code Online (Sandbox Code Playgroud)
预期的结果是
plan p<--->s <--->der p<--->itia
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法
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);
Run Code Online (Sandbox Code Playgroud)
这给出了结果
p<---> p<--->s <--->der p<--->itia
Run Code Online (Sandbox Code Playgroud)
另一种方法
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);
Run Code Online (Sandbox Code Playgroud)
结果是
plan <---> <---> <--->
Run Code Online (Sandbox Code Playgroud)
我已经通过了这个链接.这里匹配前字符串的一部分总是不变的并且是"foo"但在我的情况下它会有所不同.此外,我已经看过这个和这个,但我无法应用任何解决方案给我目前的情况.
任何帮助表示赞赏
Wik*_*żew 22
您需要在捕获组中使用以下模式:
(\w*)lan(\w+)
^-1-^ ^-2-^
Run Code Online (Sandbox Code Playgroud)
并替换为 $1<--->$2
请参阅正则表达式演示
关键是我们在我们想要保留的部分周围使用捕获组,并且只匹配我们想要丢弃的部分.
String str = "plan plans lander planitia";
System.out.println(str.replaceAll("(\\w*)lan(\\w+)", "$1<--->$2"));
// => plan p<--->s <--->der p<--->itia
Run Code Online (Sandbox Code Playgroud)
如果您需要能够替换组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
Run Code Online (Sandbox Code Playgroud)
在这里,由于我们通过匹配处理匹配,我们应该只替换组1的内容replaceFirst
,因为我们将子字符串替换为文字,我们应该Pattern.quote
这样做.