我必须解析一个文本,其中与是一个关键字,如果它没有被方括号括起来。我必须将关键字与匹配。此外,的两侧必须有单词边界。
以下是 with 不是关键字的一些示例:
以下是 with IS关键字
的一些示例有人帮忙吗? 提前谢谢。
答案 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)
您需要同时查看负面观察和负面预测,这样可以帮助您匹配数据,而不会占用括号。