如果没有#{。*和。*}包围,则Java RegEx匹配

时间:2015-12-25 13:34:47

标签: java regex

我正在尝试替换字符串中单词 true 的所有实例, 例如在"true && 0 || 1"

这些字符串可能包含变量值,标记为#{varname}。 我不想替换#{}包围的实例。

例:
"true && #{ab_true_cd} || 0"
应转换为
"1 && #{ab_true_cd} || 0"

我尝试使用此RegEx:
(?<!\#\{[^\}]*)true

通过使用上面的RegEx我得到以下错误:
Look-behind组在索引13附近没有明显的最大长度

您是否知道解决方案或更好的方法?或者有比使用RegEx更好的方法吗?

我使用http://regexe.com来测试表达式。

2 个答案:

答案 0 :(得分:1)

以下是2个带正则表达式的解决方案(Lucas TrzesniewskiTEXHIK的评论中都提到了这些解决方案):

  • 受限宽度的后视解决方案(Java正则表达式引擎支持内部限制量词的lookbehinds):

Java代码:

String rx = "(?<!#\\{[^{}]{0,500})\\btrue\\b";
String str = "true && #{ab_true_cd} || 0";
System.out.println(str.replaceAll(rx, "1"));

请参阅demo(输出:1 && #{ab_true_cd} || 0

正则表达式(?<!#\\{[^{}]{0,500})\\btrue\\b匹配任何不在true之后的整个单词#{,后跟0或最多500个字符,而不是{}

  • 另一种解决方案基于匹配您要替换的内容并匹配并捕获您想要保留的内容的方法。

代码:

String s = "true && #{ab_true_cd} || 0";
StringBuffer result = new StringBuffer();
Matcher m = Pattern.compile("(#\\{[^{}]*})|\\btrue\\b").matcher(s);
while (m.find()) {
    if (m.group(1) != null) {
        m.appendReplacement(result, m.group(1)); // if a #{} block found, restore it
    }
    else {
        m.appendReplacement(result, "1"); // else, replace true with 1
    }
}
m.appendTail(result);
System.out.println(result.toString());

请参阅another IDEONE demo

答案 1 :(得分:0)

您可以按&#39;&amp;&amp;&#39;拆分或&#39; ||&#39;,将每个部分与单词&#39; true&#39;进行比较,替换为&#39; 1&#39;,然后再将它们合并