哪里支持环视正则表达式,哪里不支持?
Where is lookaround regex supported and where isn't it?
为了提高我的正则表达式技能,我想了解前瞻和后视表达式。在我的 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
确实如此。我还尝试了几次引用 and/or 转义表达式的尝试,但都无济于事。
我现在有点困惑。有人可以澄清一下 lookaround,从教程中提到的次数来看,that 似乎不是异国情调,实际上可以在哪里使用?或者我只是搞砸了逃避我的表情?
您应该区分基本和扩展正则表达式。
在基本正则表达式中,元字符 ?
、+
、{
、|
、(
,)
失去它们的特殊意义;他们需要转义才能获得 "regex" 的含义。
另一方面,在 扩展的 正则表达式中,这些字符具有 "regex" 的含义。
如果你grep --help
,你会得到:
-E
, --extended-regexp
PATTERN is an extended regular expression (ERE)
请注意 grep 不 支持环视,它在 pcregrep.
中受支持
bash 或 sed 中可用的基本或扩展 posix 正则表达式不支持环视断言。
GNU grep 是一个很好的测试工具,它支持-P
perl 兼容 正则表达式的选项。像这样:
grep --color=auto -P '[a-z](?=b)' <<< 'ab'
甚至更好的资源是在线正则表达式测试工具,例如 https://regex101.com/
为了提高我的正则表达式技能,我想了解前瞻和后视表达式。在我的 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
确实如此。我还尝试了几次引用 and/or 转义表达式的尝试,但都无济于事。
我现在有点困惑。有人可以澄清一下 lookaround,从教程中提到的次数来看,that 似乎不是异国情调,实际上可以在哪里使用?或者我只是搞砸了逃避我的表情?
您应该区分基本和扩展正则表达式。
在基本正则表达式中,元字符 ?
、+
、{
、|
、(
,)
失去它们的特殊意义;他们需要转义才能获得 "regex" 的含义。
另一方面,在 扩展的 正则表达式中,这些字符具有 "regex" 的含义。
如果你grep --help
,你会得到:
-E
,--extended-regexp
PATTERN is an extended regular expression (ERE)
请注意 grep 不 支持环视,它在 pcregrep.
中受支持bash 或 sed 中可用的基本或扩展 posix 正则表达式不支持环视断言。
GNU grep 是一个很好的测试工具,它支持-P
perl 兼容 正则表达式的选项。像这样:
grep --color=auto -P '[a-z](?=b)' <<< 'ab'
甚至更好的资源是在线正则表达式测试工具,例如 https://regex101.com/