将Java正则表达式的第1组替换为替换整个正则表达式

Adi*_*tya 9 java regex

我有一个只有一个组的正则表达式模式.我需要在模式后面的输入字符串中查找文本并仅替换匹配组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

请参阅正则表达式演示

关键是我们在我们想要保留的部分周围使用捕获组,并且只匹配我们想要丢弃的部分.

Java演示:

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)

查看另一个Java演示

在这里,由于我们通过匹配处理匹配,我​​们应该只替换组1的内容replaceFirst,因为我们将子字符串替换为文字,我们应该Pattern.quote这样做.