关于c#:如何创建一个正则表达式来解析字符串的所有行以获取子字符串,并且仅在未找到子字符串时才返回匹配项?

How can I create a regex that parses all lines of a string for a substring, and returns a match only if the substring is not found?

我正在尝试构建一个正则表达式,但我发现对于这种特殊情况很难做到这一点。仅当我尝试解析的字符串不包含特定子字符串时,我才想返回匹配项。例如(搜索不区分大小写的子字符串"test"):

1
2
3
4
5
6
7
8
9
10
11
"Line one
Line two
Line test three"
- Return false.

"Line test one" - Return false.

"Tfest" - Return true.

"Tfest
Tdhf
Line three"
- Return true.

我已经能够使用 ^((?!message 1).)*$ 对单行字符串执行此操作,但我不确定多行字符串。

PS:我不想就使用字符串操作与正则表达式展开辩论。性能是一个问题。问题的约束是解决方案必须使用正则表达式。


您可以使用标志 RegexOptions.SingleLine 使您在正则表达式中使用的点匹配换行符:

1
new Regex(@"^((?!message 1).)*$", RegexOptions.SingleLine | RegexOptions.IgnoreCase);

问题是点与换行符不匹配。

正如 Jerry 所建议的,您可以使用单行模式(或 dotall 模式)来允许点匹配换行符。

另一种方法是避免使用点,例如单词 "test":

1
^(?>[^t]+|\\Bt|t(?!est\\b))*$

请注意,这种方式的性能更高,因为只有在单词边界前面有一个 "t" 时才会测试前瞻。 ( vs 在每个字符上使用 ^((?!\\btest\\b).)*$)