Regexp Backslash - GNU Emacs Manual表示\<
匹配单词的开头,\>
匹配单词的结尾,\b
匹配单词边界。 \b
与其他非Emacs正则表达式一样。但似乎\<
和\>
特别适用于Emacs正则表达式。是否需要\<
和\>
代替\b
?例如,\bword\b
将与\<word\>
匹配相同,唯一的区别是后者更具可读性。
答案 0 :(得分:12)
如果您认为它们的行为相同,您可能会得到意想不到的结果
什么可以\&lt;和&gt; \ b可以做什么?
答案是\<
和\>
显式 ...这个词的结尾!只有这一端!
\b
一般 ....单词的任何一端都匹配...
GNU运营商* Word Operators
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 |
答案 1 :(得分:2)
我认为\<.*?\>
只会匹配一系列单词字符,而\b.*?\b
会匹配任何一系列单词字符或一系列非单词字符,因为它也可以接受结尾一个单词,然后一个单词的开头。如果你强迫两者之间的表达成为一个单词,那么它们的行为确实相同。
当然,您可以使用\<
和\>
复制\b\w
和\w\b
的行为。所以我猜答案是肯定的,这主要是为了提高可读性。那么,正则表达式中的大多数转义字符不是用于什么?