我个人发现`\b`比`\<`和`\>`更受广泛支持。我遇到的唯一例外是vim和BSD sed支持`\<`和`\>`而不支持`\b`。
至于它们的定义:在PCRE中,它基本上是这样的:
这些链接指向
Regex101 对这些正则表达式的解释。请注意,该网站支持的四个引擎都不理解
\<
和
\>
应该执行什么操作。
由于 PCRE 明确禁止非字母数字转义的特殊含义,
\<
表示“文字开角括号”,因此
(?:\<|\>)
表示
[<>]
而不是
\b
。标准扩展正则表达式没有这种明确的禁止规定,尽管它们也没有实现任何这样的特殊含义(诸如
\<
和
\>
的项目是非标准扩展)。
还要注意,在字符类内部,情况有所不同。在大多数正则表达式解释器中,
[\b]
表示“文字退格符”,等同于
[\010]
或
[\x08]
(或
\010
或
\x08
)。将零宽度项放入字符类中毫无意义。
以下是使用 GNU grep 进行比较的示例,该工具接受两种格式:
$ echo yes |grep '\<yes'
yes
$ echo yes |grep '\byes'
yes
$ echo yes |grep '\>yes'
$
在这里,您可以看到方向性对于
\<
和
\>
很重要,但对于
\b
则不重要。
各种支持测试,仅命令行(截至2019年11月25日的Debian Testing或注明的FreeBSD 11.2):
$ echo y |grep '\<y'
y
$ echo y |grep -E '\<y'
y
$ echo y |grep -P '\<y'
$ echo y |perl -ne 'print if /\<y/'
$ echo y |sed '/\<y/!d'
y
$ echo y |sed -r '/\<y/!d'
y
$ echo y |sed '/\<y/!d'
y
$ echo y |sed -E '/\<y/!d'
y
$ echo y |gawk '/\<y/'
y
$ echo y |mawk '/\<y/'
$
$ echo y |python -c 'import re,sys; print re.findall(r"\<y", sys.stdin.read())'
[]
“grep -P”(它使用
libpcre,并非总是编译到grep中)不匹配,因为PCRE无法将“\<”识别为除了文字字符“<”之外的任何内容。
$ echo y |grep '\by'
y
$ echo y |grep -E '\by'
y
$ echo y |grep -P '\by'
y
$ echo y |perl -ne 'print if /\by/'
y
$ echo y |sed '/\by/!d'
y
$ echo y |sed -r '/\by/!d'
y
$ echo y |sed '/\by/!d'
$ echo y |sed -E '/\by/!d'
$ echo y |gawk '/\by/'
$ echo y |mawk '/\by/'
$
$ echo y |python -c 'import re,sys; print re.findall(r"\by", sys.stdin.read())'
['y']
请注意,BSD的
sed
接受
\<
但不接受
\b
,而GNU的
sed
两者都接受。
grep
不是 bash 的一部分;它可以在没有安装 shell 的情况下运行。考虑使用unix
标签,并指定特定的操作系统供应商和版本(或者如果它来自第三方如 GNU 项目,则指定 grep 版本)。 - Charles Duffy\b
和\<
都没有通用含义。 - chepner[[:<:]]
和[[:>:]]
。它在macOS和可能的BSD(我检查了OpenBSD)中支持grep
和sed
。可悲的是,GNU不支持它。 - imgx64