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).)*$)
		
		
- 我非常喜欢你的搜索方法。这很有意义。感谢您花时间添加这些有用的信息!