正则表达式匹配不包括括号的字符串
我必须解析一个文本,如果它没有被方括号包围,那么它是一个关键词。 我必须匹配关键字。 此外,必须在两侧都有单词边界。
以下是一些不是关键字的示例:
- [与]
- [与]
- [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); } }
您需要同时查看负面观察和负面预测,这将有助于您在不消耗括号的情况下匹配数据。