如何替换正则表达式中的组?

时间:2014-01-07 20:44:39

标签: java regex

在将组附加到字符串缓冲区时,您是如何确切地替换组的? 例如: (A)(B)(C) 如何用d替换组1,用e等替换组2? 我正在使用Java正则表达式引擎。 提前谢谢。

3 个答案:

答案 0 :(得分:3)

您可以使用Matcher's appendReplacement

以下是使用的示例示例:

输入:“你好bob你的猫怎么样?”

正则表达式:“(bob | cat)”

输出:“你好alice你的狗怎么样”

public static void main(String[] args) {
    Pattern p = Pattern.compile("(bob|cat)");
    Matcher m = p.matcher("hello bob How is your cat?");
    StringBuffer s = new StringBuffer();
    while (m.find()) {
        m.appendReplacement(s, doReplace(m.group(1)));
    }
    m.appendTail(s);
    System.out.println(s.toString());
}


public static String doReplace(String s) {
    if(s.equals("bob")) {
        return "alice";
    }
    if(s.equals("cat")) {
        return "dog";
    }

    return "";
}

答案 1 :(得分:1)

你在找这样的东西吗?

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Program1 {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("(a)(b)(c)");
        String str = "111abc222abc333";
        String out = null;
        Matcher m = p.matcher(str);
        out = m.replaceAll("z$3y$2x$1");
        System.out.println(out);
    }
}

这会将111zcybxa222zcybxa333作为输出 我想你会看到这个例子的作用。

但是好吧,我认为没有现成的内置 例如,你可以说的方法 - 用zzz替换组3 - 用yyy替换第2组 - 用xxx替换组1

答案 2 :(得分:0)

您可以使用Matcher#start(group)Matcher#end(group)来构建通用替换方法:

public static String replaceGroup(String regex, String source, int groupToReplace, String replacement) {
    return replaceGroup(regex, source, groupToReplace, 1, replacement);
}

public static String replaceGroup(String regex, String source, int groupToReplace, int groupOccurrence, String replacement) {
    Matcher m = Pattern.compile(regex).matcher(source);
    for (int i = 0; i < groupOccurrence; i++)
        if (!m.find()) return source; // pattern not met, may also throw an exception here
    return new StringBuilder(source).replace(m.start(groupToReplace), m.end(groupToReplace), replacement).toString();
}

public static void main(String[] args) {
    // replace with "%" what was matched by group 1 
    // input: aaa123ccc
    // output: %123ccc
    System.out.println(replaceGroup("([a-z]+)([0-9]+)([a-z]+)", "aaa123ccc", 1, "%"));

    // replace with "!!!" what was matched the 4th time by the group 2
    // input: a1b2c3d4e5
    // output: a1b2c3d!!!e5
    System.out.println(replaceGroup("([a-z])(\\d)", "a1b2c3d4e5", 2, 4, "!!!"));
}

检查 online demo here