【问题标题】:Regex to find specific strings outside complicated brackets正则表达式查找复杂括号外的特定字符串
【发布时间】:2016-05-31 12:15:57
【问题描述】:

如果我想在大括号外找到 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} {[} - 无效,因此应该匹配

问题是使用 1 个字符 { 我可以轻松地使用 [^\{]* 来排除它。如何使用多个字符(即一个单词)来做到这一点:{[

【问题讨论】:

  • 匹配并捕获您需要的内容,只匹配您不需要的内容。获取第 1 组的值。

标签: java regex


【解决方案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

【讨论】:

  • 请注意,(TEST|BEST|FEST) 可以仅与 ([TBF]EST) 匹配,因此如果您需要匹配这些文字,请使用它。
  • 非常感谢。 {[%%TEST%% {[%%TEST%%} 怎么样?我们也可以匹配这个吗?第一个 TEST 在括号外。如果一个新的括号在当前括号关闭之前开始,我们可以匹配吗?例如regex101.com/r/gG9fR8/1
  • 是的,您可以使用经过调和的贪婪令牌:\{\[(?:(?!}|\{\[).)*}|(TEST|BEST|FEST),或该令牌的展开版本:\{\[[^{}]*(?:\{(?!\[)[^{}]*)*}|(TEST|BEST|FEST)(字符串越长应该会更快)。
猜你喜欢
  • 2022-01-20
  • 1970-01-01
  • 2015-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 2015-08-09
  • 1970-01-01
相关资源
最近更新 更多