现在,我有三个字符串需要通过单个 re 进行匹配——'a'、'ab'、'ac'。我猜想一个正确的 re 应该是 'a[bc]?',但似乎不正确。哪个是正确的?
我在 grep 命令中尝试了它。似乎 grep 的正则表达式中没有 '?'。那么如何在 grep 中进行这种匹配?
感谢@anubhava,我现在可以通过以下方式匹配所有这三个字符串:
grep -E 'a[bc]?' <file>
但是,此表达式也与“ad”匹配。
事实上,我想匹配所有这些情况:'a','abc','ab','ac',但不想匹配'ad'或'ae'
答案1
如果您想在 grep 命令中使用上述内容,请使用-E
带有单词边界的扩展正则表达式支持开关:
grep -E "\ba[bc]?\b" file
或者
grep -E "\<a[bc]?\>" file
答案2
要在基本模式下使用此表达式,您需要转义问号:
grep 'a[bc]\?' file
更新
为了解决您的最新问题,我建议使用 P(erl) 模式:
grep -P 'a(?![de])|a[bc]|abc'
这些是替代方案:
如果后面没有“d”或“e”,则匹配“a”(使用负向前瞻)
匹配“ab”或“ac”
匹配“abc”
答案3
如果希望字符串从头到尾匹配正则表达式,则需要在正则表达式中包含开始^
和结束$
标记
^a[bc]?$
如果标记不是正则表达式的一部分,123ab456
则将匹配正则表达式。