Emacs正则表达式:什么\<和\>可以那样做\ b不能做到吗?

时间:2011-04-30 19:31:24

标签: regex emacs word

Regexp Backslash - GNU Emacs Manual表示\<匹配单词的开头,\>匹配单词的结尾,\b匹配单词边界。 \b与其他非Emacs正则表达式一样。但似乎\<\>特别适用于Emacs正则表达式。是否需要\<\>代替\b?例如,\bword\b将与\<word\>匹配相同,唯一的区别是后者更具可读性。

2 个答案:

答案 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的行为。所以我猜答案是肯定的,这主要是为了提高可读性。那么,正则表达式中的大多数转义字符不是用于什么?