正则表达式匹配匹配字符串旁边不包含特定单词的字符串

时间:2016-02-18 09:23:31

标签: c# .net regex

我的文字如下

 1. This is                678         897        999
    not a text which I want


   2. This is                 678         897        879

我已将正则表达式应用为

This\s*is\s*(\s+\d+){1,}(?: ){0,}[\r\n]+

现在我想要的是匹配匹配字符串旁边没有 的字符串。我不希望正则表达式匹配第一个字符串。

修改

假设我有2个字符串,我应用了正则表达式,然后我找到了2个匹配

This is                678         897        999
This is                 678         897        879

到目前为止这一切都很完美,但现在我想要的是不包含 的正则表达式(在第一个字符串中) ,我想只匹配第二个字符串。

2 个答案:

答案 0 :(得分:3)

This\s*is\s*(\s+\d+){1,}(?: ){0,}(?:[\r\n]+|$)(?!not)

只需添加lookahead。请参阅演示。

https://regex101.com/r/eB8xU8/8

答案 1 :(得分:0)

  

我想要不包含not的正则表达式(在第一个字符串中),我想只匹配第二个字符串。

这意味着您应该检查This is...模式是否后跟新行序列+空格* + not作为整个单词并禁用回溯。我们可以在.NET中使用 atomic group 禁用回溯:

(?>This\s+is(?:\s+\d+)+ *)(?![\r\n]+\p{Zs}*not\b)

请参阅regex demo

正则表达式This\s+is(?:\s+\d+)+ *的第1部分匹配This is,后跟一个或多个空格的一个或多个序列,后跟一个或多个数字,然后是零个或多个空格。 (?>...)阻止了模式中这一部分的回溯。如果先前匹配的文本后面跟着空白后跟整个单词(?![\r\n]+\p{Zs}*not\b)(其中not代表单词边界),前瞻\b将无法匹配。