Regexp Backslash - GNU Emacs Manual指出,\<
匹配单词的开头,\>
匹配单词的结尾,而\b
则匹配单词边界。与其他非Emacs正则表达式一样,\b
也是相同的。但似乎\<
和\>
只适用于Emacs正则表达式。是否存在需要使用\<
和\>
而不是\b
的情况?例如,\bword\b
与\<word\>
将匹配相同的内容,唯一的区别在于后者更易读。
Regexp Backslash - GNU Emacs Manual指出,\<
匹配单词的开头,\>
匹配单词的结尾,而\b
则匹配单词边界。与其他非Emacs正则表达式一样,\b
也是相同的。但似乎\<
和\>
只适用于Emacs正则表达式。是否存在需要使用\<
和\>
而不是\b
的情况?例如,\bword\b
与\<word\>
将匹配相同的内容,唯一的区别在于后者更易读。
如果您假设它们的行为相同,可能会得到意想不到的结果。..
那么\<
和\>
可以做什么呢?
答案是,\<
和\>
是显式的...只匹配单词结尾!而且只能匹配单词结尾!
\b
是通用的...可以匹配单词的任何一端...
GNU 运算符 * 单词运算符
line="cat dog sky"
echo "$line" |sed -n "s/\(.*\)\b\(.*\)/# |\1|\2|/p"
echo "$line" |sed -n "s/\(.*\)\>\(.*\)/# |\1|\2|/p"
echo "$line" |sed -n "s/\(.*\)\<\(.*\)/# |\1|\2|/p"
echo
line="cat dog sky"
echo "$line" |sed -n "s/\(.*\)\b\(.*\)/# |\1|\2|/p"
echo "$line" |sed -n "s/\(.*\)\>\(.*\)/# |\1|\2|/p"
echo "$line" |sed -n "s/\(.*\)\<\(.*\)/# |\1|\2|/p"
echo
line="cat dog sky "
echo "$line" |sed -n "s/\(.*\)\b\(.*\)/# |\1|\2|/p"
echo "$line" |sed -n "s/\(.*\)\>\(.*\)/# |\1|\2|/p"
echo "$line" |sed -n "s/\(.*\)\<\(.*\)/# |\1|\2|/p"
echo
输出
# |cat dog |sky|
# |cat dog| sky|
# |cat dog |sky|
# |cat dog |sky|
# |cat dog| sky|
# |cat dog |sky|
# |cat dog sky| |
# |cat dog sky| |
# |cat dog |sky |
在我看来,\<.*?\>
只会匹配一系列的单词字符,而 \b.*?\b
则可以匹配一系列的单词字符或非单词字符,因为它也可以接受一个单词的结尾,然后再是另一个单词的开头。如果你强制将两者之间的表达式设置为单词,它们确实会表现得相同。
当然,你可以使用 \b\w
和 \w\b
来复制 \<
和 \>
的行为。所以我想答案是肯定的,这主要是为了可读性。不过话说回来,正则表达式中的大多数转义字符不都是为了可读性吗?
\\
不是为了可读性而存在的,它用于将一个正则表达式运算符与相同字形的字面字符区分开来。 - Peter.O\w
和\d
(不是\
本身)通常可以用字符类中的其他字符替换,比如[0-9]
。 - dlras2\<.*\>
将匹配由单词字符限定的任何字符串。.*
是贪婪的,因此会尽可能匹配多个任意字符。要仅匹配单个单词,您可以使用非贪婪变体:\<.*?\>
。 - phils
\<
和\>
来自原始的 vi,并且一直沿用至今。 - tchrist