使用另一个正则表达式替换正则表达式

3
我希望用Java中的正则表达式替换一些正则表达式,例如:

要求:

输入:xyxyxyP

所需输出:xyzxyzxyzP

这意味着我想将“(for)+\{”替换为“(for\{)+\{”。有没有办法做到这一点?

我尝试了以下代码

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

public class ReplaceDemo2 {

    private static String REGEX = "(xy)+P";
    private static String INPUT = "xyxyxyP";
    private static String REGEXREPLACE = "(xyz)+P";

    public static void main(String[] args) {
        Pattern p = Pattern.compile(REGEX);
        // get a matcher object
        Matcher m = p.matcher(INPUT);
        INPUT = m.replaceAll(REGEXREPLACE);
        System.out.println(INPUT);
    }
}

但输出结果为 (xyz)+P
1个回答

3
你可以使用基于\G的正则表达式来实现它:
String s = "xyxyxyP";
String pattern = "(?:(?=xy)|(?!^)\\G)xy(?=(?:xy)*P)";
System.out.println(s.replaceAll(pattern, "$0z")); 

查看正则表达式演示IDEONE演示

简而言之,正则表达式匹配:

  • (?:(?=xy)|(?!^)\\G) - 一个位置后面跟着xy(?=xy)),或者前一次成功匹配的位置((?!^)\\G
  • xy - 文字序列xy,但仅当其后面是...
  • (?=(?:xy)*P) - 零个或多个xy序列(由于(?:xy)*)后面跟着一个P

你能分享一下从 "xyabxyP" 中获取 "xyzabzxyzP" 的正则表达式吗? - undefined
不知道这个模式可能是什么。尝试使用.replaceAll("xy|(?!P)[^x]*(?:x(?!y)[^x]*)*(?=.*P)", "$0z") - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接