正则表达式匹配不包括括号的字符串

我必须解析一个文本,如果它没有被方括号包围,那么它是一个关键词。 我必须匹配关键字。 此外,必须在两侧都有单词边界。

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

  • [与]
  • [与]
  • [sometext with sometext]
  • [sometext with]
  • [有些文字]

以下是使用 IS关键字的一些示例

  • 你好
  • 你好世界
  • 你好[世界]与你好
  • 你好[世界]与你好[世界]

有人帮忙吗? 提前致谢。

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

 Regex regexObj = new Regex( @"(? 

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

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

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

匹配[和…很容易。

 \[with 

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

 \[(?!]).*with 

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

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

多一点调整

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

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

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

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

您需要同时查看负面观察和负面预测,这将有助于您在不消耗括号的情况下匹配数据。