如何编写正则表达式匹配含指定字符串且不含另一字符串的行
如何用正则匹配包含"app prod"且不含"ignore"的行
问题描述
假设我有以下行:
- blah app prod blah blah
- blah app prod blah ignore
- blah app staging blah blah
- blah app staging blah ignore
- blah app prod blah blah blah ignore blah blah
- blah blah
我想要编写一个正则表达式,匹配所有包含"app prod"且不包含"ignore"的行,即仅匹配第1行。我尝试了正则表达式
.*app prod.*((?!ignore).)*,但它返回了第1、2、5行,请问正确的正则表达式应该怎么写?
问题分析
你之前的正则失效原因很明确:.*app prod.*会优先匹配到"app prod"之后的所有内容(包括"ignore"),后续的((?!ignore).)*从行尾位置开始匹配,根本触发布局否定断言,所以会错误匹配含"ignore"的行。
正确正则表达式
方案一:纯正则通用写法
这是最可靠的纯正则方案,直接在开头用负向预查排除所有包含"ignore"的行,再匹配目标内容:
^(?!.*ignore).*app prod.*$
各部分含义:
^:匹配行的起始位置(?!.*ignore):负向预查,断言整行中不存在"ignore"字符串.*app prod.*:匹配包含"app prod"的任意内容$:匹配行的结束位置
方案二:工具辅助简化写法
如果使用的工具支持反向过滤(比如grep的-v参数),可以拆分两步操作:先过滤掉含"ignore"的行,再匹配含"app prod"的行:
# 示例:用grep实现 grep -v "ignore" | grep "app prod"
但纯正则场景下,方案一的写法通用性更强。
内容的提问来源于stack exchange,提问作者Johnny Metz
相关产品推荐
相关产品推荐

