在 的手册页中grep
,我看到
The symbols \< and \> respectively match the empty string at the beginning and
end of a word. The symbol \b matches the empty string at the edge of a word.
但我仍然无法弄清楚其中的区别。对我来说,\b
是 Perl 的字边界表示法,而\<
Vim 的表示法也用于相同目的。
PS:英语不是我的母语。如果您觉得差异很明显,请原谅我。
答案1
\<
匹配单词的开头
\>
匹配单词的结尾
\b
匹配两个边界(如果位于末尾或开头)
这些特殊字符的重要之处在于它们匹配空字符串而不是单词边界本身。字边界与Posix 表示法中\w
等价的 [_[:alnum:]]
(字母 a 到 Z、数字和)表示的字符集相反。_
例子
最后,格雷姆找到一个非常有趣的例子:
$ echo 'acegi z' | grep -o '[acegi ]*\>' | cat -A
acegi$
$ echo 'acegi z' | grep -o '[acegi ]*\b' | cat -A
acegi $
目前,该示例表明,有时精确匹配单词结尾而不是单词边界是有用的,因为通过匹配单词结尾可以避免使用匹配空格字符。
因此,在一个更有用的示例中,我想说,如果您想匹配非单词字符和该非单词的结尾,则不能使用\>
;但也许\b
可以在这种特殊情况下使用,因为它将匹配下一个单词的开头。
到目前为止,我还没有想到任何例子。但在我看来,可能有一些用例是有意义的,但我的猜测是,这只是出于可读性的目的,因为当你把\b
它写得很模糊时,但如果你精确地给出单词的开头或结尾,那么它可以更好地理解正则表达式给阅读它的人。
答案2
回答你标题上的问题?
\b
和有什么区别\<
...
几乎没有。两者都匹配边界,单词和非单词之间的过渡。
唯一的技术的区别在于:
- 匹配
\b
边界两个都单词的开头和结尾。 - 唯一
\<
匹配的是开始一句话。 - 唯一
\>
匹配的是结尾一句话。
这实际的区别在于:
$ echo ',,abc...' | grep -o '[abc.,]*'
,,abc... # match the whole string
$ echo ',,abc...' | grep -o '[abc.,]*\b'
,,abc # to the rightmost (due to *) word boundary.
$ echo ',,abc...' | grep -o '[abc.,]*\>'
,,abc # match to the same point (in this case).
$ echo ',,abc...' | grep -o '[abc.,]*\<'
,, # match to the rightmost **start** of a word.
对空格也可以做同样的事(添加 cat 来显示空格):
直到最右边的“单词边界”(任意)(注意空格):
$ echo 'abcd abcd Z' | grep -o '[a-z ]*\b' | cat -A
abcd abcd $
直到最右边的“单词开始”(同一点):
$ echo 'abcd abcd Z' | grep -o '[a-z ]*\<' | cat -A
abcd abcd $
直到最右边的“词尾”(无尾随空格):
$ echo 'abcd abcd Z' | grep -o '[a-z ]*\>' | cat -A
abcd abcd$
或者,使用 sed:
四字边界:
$ echo "abc %-= def." | sed 's/\b/ |>X<| /g'
|>X<| abc |>X<| %-= |>X<| def |>X<| .
两个词的开头:
$ echo "abc %-= def." | sed 's/\</ |>X<| /g'
|>X<| abc %-= |>X<| def.
以及单词的两个结尾:
$ echo "abc %-= def." | sed 's/\>/ |>X<| /g'
abc |>X<| %-= def |>X<| .
参考
来自 GNU 信息 sed:
'\b'
匹配单词边界;也就是说,如果左边的字符是“单词”字符,右边的字符是“非单词”字符,则它匹配,反之亦然。
$ echo "abc %-= def." | sed 's/\b/X/g' XabcX %-= XdefX.
开始
'<' 匹配单词的开头。
$ echo "abc %-= def." | sed 's/\</X/g' Xabc %-= Xdef.
结尾
'>' 匹配单词的结尾。
$ echo "abc %-= def." | sed 's/\>/X/g' abcX %-= defX.