正则表达式嵌套匹配替换问题,需要编写一个正则表达式匹配:“${if(任意字符)} ”,如果匹配上就替换为一个指定内容。
目前写的:
\$\{\s*if([\s\S]*)\}
可以实现匹配,但是如果存在内部循环的情况,会被全部替换掉,如下图所示。
目前这个正则表达式,会直接从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]*?)\}
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方法