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:我不想就使用字符串操作与正则表达式展开辩论。性能是一个问题。问题的约束是解决方案必须使用正则表达式。
- \\btest\\b 会起作用,如果 IsMatch 那么你可以运行你的代码,因为它包含子字符串。
-
@abc123 它似乎不适用于 @"Line onetddest (NEWLINE) 消息 1dwd"
-
尝试使用标志 RegexOptions.SingleLine。
-
谢谢杰里,这有效!发布您的答案作为解决方案。
-
"性能是一个问题。"你的印象是正则表达式很快吗?
-
@GrantThomas stackoverflow.com/questions/12428776/… 但同样,我不会接受这场辩论。请使用其他线程来辩论该条款。
-
应用特定类型问题的链接不一定普遍适用;我不介意对此进行辩论,公平地说,这是一个诚实的问题。如果您认为这是特定于您的案例,您可能已将其添加到子句中的问题中。
-
而不是使用:if(IsMatch(Str,negativePattern) 逻辑,使用:if(!IsMatch(Str,positivePattern) 会快得多。
您可以使用标志 RegexOptions.SingleLine 使您在正则表达式中使用的点匹配换行符:
1
| new Regex (@"^((?!message 1).)*$", RegexOptions .SingleLine | RegexOptions .IgnoreCase); |
问题是点与换行符不匹配。
正如 Jerry 所建议的,您可以使用单行模式(或 dotall 模式)来允许点匹配换行符。
另一种方法是避免使用点,例如单词 "test":
1
| ^(?>[^t]+|\\Bt|t(?!est\\b))*$ |
请注意,这种方式的性能更高,因为只有在单词边界前面有一个 "t" 时才会测试前瞻。 ( vs 在每个字符上使用 ^((?!\\btest\\b).)*$)
- 我非常喜欢你的搜索方法。这很有意义。感谢您花时间添加这些有用的信息!