我正在尝试定义一个正则表达式,以匹配以aaa
开头但不包含xxx
的行。一世。即匹配这些行:
aaa bbb yyy
aaa ooo zzz
aaa bbgdb ooo
但不是这样:
aaa ppp xxx
我试着这样做:
aaa.*?(?!xxx)
但它匹配所有提到的行。 我做错了什么?
答案 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 +字符。