有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java正则表达式匹配,如果不被#{.*和.*}包围

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

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

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

我尝试使用这个正则表达式:
(?<!\#\{[^\}]*)true

通过使用上面的正则表达式,我得到了以下错误:
在指数13附近,“回头看”组并没有明显的最大长度

您知道解决方案或更好的方法吗?还是有比使用正则表达式更好的方法

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


共 (2) 个答案

  1. # 1 楼答案

    你可以用“&&;'或“||”,将每个部分与单词“true”进行比较,替换为“1”,然后再次合并它们

  2. # 2 楼答案

    下面是两个使用正则表达式的解决方案(都在Lucas TrzesniewskiTEXHIK的评论中提到):

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

    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