java - 替换 Java 正则表达式的第 1 组而不替换整个正则表达式

标签 java regex

我有一个只有一组的正则表达式模式。我需要在输入字符串中找到符合模式的文本,并仅替换匹配组 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”但在我的情况下它会有所不同。我也看过 thisthis但我无法将任何解决方案应用到我当前的场景中。

感谢任何帮助

最佳答案

您需要将以下模式与捕获组一起使用:

(\w*)lan(\w+)
^-1-^   ^-2-^

并替换为$1<--->$2

参见 regex demo

重点是我们在想要保留的部分周围使用捕获组,并只匹配我们想要丢弃的部分。

Java 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

参见 another Java demo

在这里,由于我们逐场处理,我们应该只用 replaceFirst 替换第 1 组的内容一次,并且由于我们将子字符串替换为文字,所以我们应该 Pattern.quote

关于java - 替换 Java 正则表达式的第 1 组而不替换整个正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38296673/

相关文章:

java - java正则表达式中有没有一种方法可以定义一组要查找的字母?

javascript - 字符串上的正则表达式或 For 循环 - 拆分和连接

Java 枚举、静态类变量——为什么我不能这样做?

java - Sublime Text 2 - 开箱即用编译和运行 Java 程序

java - Lambdas : local variables need final, 实例变量没有

java - 替换所有起始行和空行处的所有空格

java - 如何在 Eclipse 中获取选定的代码?

Java String.matches ("regex")

java - 将java中的数学函数转换为javascript函数

r - 使用 gsub 转换模式