试图提高我的正则表达式技能,我想了解前瞻和后瞻性表达。在我的Archlinux系统上,我尝试了以下内容:
a=ab;if [[ $a =~ [a-z](?=b) ]]; then echo "Y";else echo "N";fi
据我所知,应该匹配并因此回显“Y”,但不是。
echo ab |sed 's/[a-z](?=b)/x/'
...似乎也不匹配。
grep
似乎也看不到,但pcregrep
确实如此。我也试过几次引用和/或逃避表达的尝试,但没有用。
我现在有点困惑。有人可以澄清哪些外观,似乎 异国情调,从教程中的提及数量来看,实际上可以使用?或者我只是搞砸了逃避我的表情?
答案 0 :(得分:2)
在bash或sed中提供的基本或扩展posix正则表达式不支持lookaround断言。
一个很好的测试工具是GNU grep,它支持 perl兼容的正则表达式的-P
选项。像这样:
grep --color=auto -P '[a-z](?=b)' <<< 'ab'
即使是更大的资源,也可以使用https://regex101.com/
等在线正则表达式测试工具答案 1 :(得分:1)
您应该区分基本和扩展正则表达式。
在基本正则表达式中,元字符 ?
,+
,{
,|
,(
和{ {1}} 失去他们的特殊含义;他们需要逃脱才能获得“正则表达式”的含义。
另一方面,在扩展正则表达式中,这些字符具有“正则表达式”的含义。
如果你)
,你会得到:
grep --help
,-E
PATTERN是扩展正则表达式(ERE)
请注意,grep 不支持支持环视, pcregrep 支持它。