Java 正则表达式在复杂括号外查找特定字符串

Java 正则表达式在复杂括号外查找特定字符串,java,regex,Java,Regex,如果我想得到单词TEST、BEST、FEST,如果在花括号外找到,我会使用以下正则表达式: ^(?:[^\{]*(?:\{.*\})*)(?:(?:[^\{]*(TEST|BEST|FEST))|(?:.*(TEST|BEST|FEST)(?!\}))) 看 但是如果我想在复杂的括号外找到这些单词,比如在{[something}之外,该怎么办呢。 示例: {[TEST}-有效,因此不匹配 {[}{[BEST}-有效,因此不匹配 bla{[}{[FEST}-有效,因此不匹配 测试-无效,因为它的

如果我想得到单词TEST、BEST、FEST,如果在花括号外找到,我会使用以下正则表达式:

^(?:[^\{]*(?:\{.*\})*)(?:(?:[^\{]*(TEST|BEST|FEST))|(?:.*(TEST|BEST|FEST)(?!\})))

但是如果我想在复杂的括号外找到这些单词,比如在{[something}之外,该怎么办呢。 示例:

  • {[TEST}-有效,因此不匹配
  • {[}{[BEST}-有效,因此不匹配
  • bla{[}{[FEST}-有效,因此不匹配
  • 测试-无效,因为它的外部括号复杂,因此应该匹配
  • {[}{[FEST-无效,因此应该匹配
  • bla{[}hi{[}TEST}{[}-无效,因此应该匹配

  • 问题是,对于一个字符{我可以很容易地使用
    [^\{]*
    来排除它。如何使用多个字符,即一个单词:{[

    您可以使用一个捕获组来获取所需的值,然后与所有其他值进行匹配。换句话说,匹配并捕获所需的值,然后与不需要的值进行匹配。获取组1的值

    \{\[[^}]*}|(TEST|BEST|FEST)
    

    \{\[^}]*}
    匹配到第一个
    }
    为止的
    {[
    以外的任何0+字符,以及您不需要的这些值。您需要的值在组1中

    示例代码:

    List<String> strs = Arrays.asList("{[TEST}", "{[} {[BEST}", "bla {[} {[FEST}", "TEST","{[} {[FEST", "bla {[} hi {[} TEST} {[}");
    for (String str : strs)
    {
        Matcher m = Pattern.compile("\\{\\[[^}]*}|(TEST|BEST|FEST)").matcher(str);
        while(m.find()) {
            if (m.group(1) != null) {
                System.out.println(m.group(1) + " found in '" + str + "'");
            }
        }
    }
    

    请参见

    匹配并捕获您需要的内容,然后只匹配您不需要的内容。获取组1的值。请注意,
    (TEST | BEST | FEST)
    可以仅通过
    ([TBF]EST)
    进行匹配,因此如果您需要匹配这些文本,请使用此选项。非常感谢。{[%%TEST%%TEST%{[%%TEST%}呢?我们也可以匹配这个吗?第一个测试在括号外。如果在关闭当前括号之前启动新括号,我们可以匹配吗?例如,可以,您可以使用一个新括号:,或该括号的展开版本:(字符串越长,它应该越快)。
    List<String> strs = Arrays.asList("{[TEST}", "{[} {[BEST}", "bla {[} {[FEST}", "TEST","{[} {[FEST", "bla {[} hi {[} TEST} {[}");
    for (String str : strs)
    {
        Matcher m = Pattern.compile("\\{\\[[^}]*}|(TEST|BEST|FEST)").matcher(str);
        StringBuffer result = new StringBuffer();
        while(m.find()) {
            if (m.group(1) != null) {
                m.appendReplacement(result, "NEW_"+m.group(1));
            } else {
                m.appendReplacement(result, m.group(0));
            }
        }
        m.appendTail(result);
        System.out.println(result.toString());
    }