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

时间:2016-05-31 12:15:58

标签: java regex

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

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

请参阅https://regex101.com/r/vB2fS0/1

但如果我想在复杂的括号外找到这些单词,例如{{something}之外的话,该怎么办?注意 {[而不仅仅是 {。 示例:

  1. {[TEST} - 有效,因此无匹配
  2. {[} {[BEST} - 有效,因此无匹配
  3. bla {[} {[FEST} - 有效,因此无匹配
  4. TEST - 无效,因为它的外部复杂括号因此匹配
  5. {[} {[FEST - 无效,因此匹配
  6. bla {[} hi {[} TEST} {[} - 无效,因此匹配
  7. 问题在于,使用1个字符 {我可以轻松使用[^\{]*来排除它。如何使用多个字符,即单词: {[

1 个答案:

答案 0 :(得分:1)

您可以使用捕获组来获取所需的值,并匹配所有其他值。换句话说,匹配并捕捉您需要的东西,并匹配您不需要的东西。抓住第1组值。

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

请参阅regex demo

\{\[[^}]*}匹配{[,除了}以外的任何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 + "'");
        }
    }
}

请参阅IDEONE demo

如果您需要替换这些值,请使用Matcher#appendReplacement

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());
}

请参阅another Java demo