外观正则表达式支持哪里,哪里不是?

时间:2015-12-27 12:22:40

标签: regex regex-lookarounds lookahead lookbehind

试图提高我的正则表达式技能,我想了解前瞻和后瞻性表达。在我的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确实如此。我也试过几次引用和/或逃避表达的尝试,但没有用。

我现在有点困惑。有人可以澄清哪些外观,似乎 异国情调,从教程中的提及数量来看,实际上可以使用?或者我只是搞砸了逃避我的表情?

2 个答案:

答案 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 支持它。