Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何替换正则表达式中的组?_Java_Regex - Fatal编程技术网

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

Java 如何替换正则表达式中的组?,java,regex,Java,Regex,在将组附加到字符串缓冲区时,如何替换组? 例如: (a) (b)(c) 如何用d替换组1,用e替换组2等等? 我正在使用Java正则表达式引擎。 提前谢谢。你在找这样的东西吗 import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Program1 { publ

在将组附加到字符串缓冲区时,如何替换组? 例如: (a) (b)(c) 如何用d替换组1,用e替换组2等等? 我正在使用Java正则表达式引擎。
提前谢谢。

你在找这样的东西吗

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
作为输出。
我想你会看到这个例子的作用。

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

您可以使用并构建通用替换方法:

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, "!!!"));
}
publicstaticstringreplacegroup(stringregex、stringsource、int-groupToReplace、stringreplacement){
返回replaceGroup(regex,source,groupToReplace,1,replacement);
}
公共静态字符串替换组(字符串正则表达式、字符串源、int-groupToReplace、int-groupOccurrence、字符串替换){
Matcher m=Pattern.compile(regex.Matcher)(源代码);
对于(int i=0;i

选中

您可以使用
匹配器的

下面是一个示例,使用:

输入:“你好,鲍勃,你的猫怎么样?”

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

输出:“你好,爱丽丝,你的狗好吗”


这种情况下,有lambdas不是很好吗?然后,您可以通过一个小循环运行这些lambda,甚至可以利用哈希映射将正则表达式组存储为键,将它们的替换模式存储为值!快点JDK 8!在进行替换之前,无需调用
find()
。如果没有匹配项,
replaceAll()
只返回原始字符串。@Alanmore同意。已更新。+1,但您忘记通过调用
appendTail()
来完成它。我修好了,这比需要的复杂多了。请参阅。@alanmore
appendReplacement()
是一种优雅的解决方案,适用于简单替换即可的情况。即使如此,对于这种情况,我认为我的解决方案并不复杂。尽管如此,方法
replaceGroup()
解决了一个比简单替换更复杂的问题,而且是以一种通用的、参数化的方式。试着用另一个在我的示例
main()
上获得结果,你就会明白我的意思。我想我可能也找到了另一个解决方案。我想看看switch语句是否能帮助我们解决问题。
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 "";
}