正则表达式嵌套匹配替换问题

正则表达式嵌套匹配替换问题,需要编写一个正则表达式匹配:“${if(任意字符)} ”,如果匹配上就替换为一个指定内容。

目前写的:

\$\{\s*if([\s\S]*)\}

可以实现匹配,但是如果存在内部循环的情况,会被全部替换掉,如下图所示。

img

目前这个正则表达式,会直接从A到D1全部替换了。我想实现 A-A1、B-B1、C-C1、D-D1 一个部分一个部分的匹配和替换,请帮忙,感激不尽!

正则表达式改为

\$\{\s*if([\s\S]*?)\}

*号在正则表达式中是贪婪匹配,如果想非贪婪匹配,要配合?问号一起使用。具体来说,在你的例子中,正则表达式 ${\s*if([\s\S]*)} 和 ${\s*if([\s\S]*?)} 用于匹配字符串中的条件标记,其中条件标记的形式为 ${\sif(条件)\s}$。

  • ${\s*if([\s\S]*?)} 使用了量词 *?,它表示匹配前面的子表达式零次或多次,但尽可能少地匹配。
  • ${\s*if([\s\S]*)} 使用了量词 *,它表示匹配前面的子表达式零次或多次。
\$\{\s*if([\s\S]*?)\}

https://blog.csdn.net/weixin_55166132/article/details/123695805
可参考正则的贪婪模式和非贪婪模式

一、加个问号懒惰模式搜索
二、中间不得出现“{”: 加个[^\{]

代码:


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

public class tmp_pattern {
    public static void main(String[] args) {
        // 按指定模式在字符串查找
        String line = "${if (11)};;;;${if(22\n)}2rwefwe${IF(22\n)}";
        System.out.println("替换前: " + line);
        String pattern = "\\$\\{\\s*if([\\s\\S]*?)\\}|\\$\\{\\s*IF([\\s\\S]*?)\\}";

        // 创建 Pattern 对象
        Pattern r = Pattern.compile(pattern);

        // 现在创建 matcher 对象
        Matcher m = r.matcher(line);
        line = m.replaceAll("xxx");
        System.out.println("替换后: " + line);

    }
}


打印结果:


替换前: ${if (11)};;;;${if(22
)}2rwefwe${IF(22
)}
替换后: xxx;;;;xxx2rwefwexxx

Process finished with exit code 0

正则表达式 ${if(.*?)}
另外注意,你在代码中使用matcher的find方法,不用使用match方法

img

借鉴下
https://www.jb51.net/article/238616.htm