正则表达式匹配未被括号括起来的字符串

时间:2011-08-10 04:06:37

标签: c# regex

我必须解析一个文本,其中是一个关键字,如果它没有被方括号括起来。我必须将关键字匹配。此外,两侧必须有单词边界。

以下是 with 不是关键字的一些示例:

  • [与]
  • [with]
  • [sometext with sometext]
  • [sometext with]
  • [with sometext]

以下是 with IS关键字

的一些示例
  • ]
  • 你好
  • 你好世界
  • hello [world] with hello
  • hello [world] with hello [world]

有人帮忙吗? 提前谢谢。

4 个答案:

答案 0 :(得分:17)

您可以查找单词with,看看左侧最近的支架不是左括号,右侧最近的支架不是右括号:

Regex regexObj = new Regex(
    @"(?<!     # Assert that we can't match this before the current position:
     \[        #  An opening bracket
     [^[\]]*   #  followed by any other characters except brackets.
    )          # End of lookbehind.
    \bwith\b   # Match ""with"".
    (?!        # Assert that we can't match this after the current position:
     [^[\]]*   #  Any text except brackets
     \]        #  followed by a closing bracket.
    )          # End of lookahead.", 
    RegexOptions.IgnorePatternWhitespace);
Match matchResults = regexObj.Match(subjectString);
while (matchResults.Success) {
    // matched text: matchResults.Value
    // match start: matchResults.Index
    // match length: matchResults.Length
    matchResults = matchResults.NextMatch();
}

环视表达式不会在换行符处停止;如果您希望单独评估每一行,请使用[^[\]\r\n]*代替[^[\]]*

答案 1 :(得分:3)

好问题。我认为找到适用[with]模式的匹配项会更容易,然后反转结果。

您需要匹配[,而不是],然后是with(然后是关闭方括号的相应模式)

匹配[with非常简单。

\[with

添加预测以排除],并允许任意数量的其他字符(.*

\[(?!]).*with

然后是相应的闭合方括号,即反向带有后视。

\[(?!]).*with.*\](?<1[)

稍微调整一下

\[(?!(.*\].*with)).*with.*\](?<!(with.*\[.*))

现在如果你反过来,你应该得到你想要的结果。 (即当这返回'true'时,您的模式匹配并想要排除这些结果)。

答案 2 :(得分:1)

我认为最简单的解决方案是抢先匹配平衡的括号对及其内容,以便在搜索关键字时将它们排除在外。这是一个例子:

string s = 
  @"[with0]
  [ with0 ]
  [sometext with0 sometext]
  [sometext with0]
  [with0 sometext]


  with1
  ] with1
  hello with1
  hello with1 world
  hello [ world] with1 hello
  hello [ world] with1 hello [world]";

Regex r = new Regex(@"\[[^][]*\]|(?<KEYWORD>\bwith\d\b)");
foreach (Match m in r.Matches(s))
{
  if (m.Groups["KEYWORD"].Success)
  {
    Console.WriteLine(m.Value);
  }
}

答案 3 :(得分:0)

您需要同时查看负面观察和负面预测,这样可以帮助您匹配数据,而不会占用括号。