正则表达式匹配以一个单词开头但不包含另一个单词的行

时间:2017-09-27 09:30:12

标签: regex

我正在尝试定义一个正则表达式,以匹配以aaa开头但不包含xxx的行。一世。即匹配这些行:

  

aaa bbb yyy

     

aaa ooo zzz

     

aaa bbgdb ooo

但不是这样:

  

aaa ppp xxx

我试着这样做:

aaa.*?(?!xxx)

但它匹配所有提到的行。 我做错了什么?

1 个答案:

答案 0 :(得分:1)

您的aaa.*?(?!xxx)模式与字符串中的aaa匹配,然后检查当前位置右侧是否有xxx.*?甚至没有尝试过是一个懒惰量化的子模式)。由于aaa中的aaa ppp xxx后面有空格,因此会返回有效匹配。

您必须在开头添加^锚点(此外,您最有可能需要m修饰符或其内嵌版本(?m),位于模式的开头并将.*.*?放在前瞻中:

^aaa(?!.*?xxx).*
      ^^^

请参阅regex demo。请注意,您需要使用appriopriate修饰符^使m匹配行的开头(如果未在Ruby中使用,或者在Notepad ++中使用^默认匹配行的开头)。

<强>详情

  • ^ - 开始行
  • aaa - aaa substring
  • (?!.*?xxx) - 如果除了换行符之外的任何0 +字符之后有xxx子字符串,则会导致匹配失败的否定前瞻
  • .* - 线路的其余部分,除了换行符之外的0 +字符。

enter image description here