Regex Emacs正则表达式:什么\<;和\>;可以这样做\b不能这样做?

Regex Emacs正则表达式:什么\<;和\>;可以这样做\b不能这样做?,regex,emacs,word,Regex,Emacs,Word,表示\匹配单词的结尾,并且\b匹配单词边界\b与其他非Emacs正则表达式中的一样。但似乎\是Emacs正则表达式特有的。是否存在需要\而不是\b的情况?例如,\b word\b将与\匹配,唯一的区别是后者更可读。在我看来,\将只匹配一系列单词字符,而\b.*\b将匹配一系列单词字符或一系列非单词字符,因为它也可以接受一个词的结尾,然后是一个词的开头。如果你强迫这两个词之间的表达成为一个词,它们的行为确实是一样的 当然,您可以使用\b\w和\w\b复制\和\w\b的行为。所以我想答案是肯定的,主

表示
\
匹配单词的结尾,并且
\b
匹配单词边界
\b
与其他非Emacs正则表达式中的一样。但似乎
\
是Emacs正则表达式特有的。是否存在需要
\
而不是
\b
的情况?例如,
\b word\b
将与
\
匹配,唯一的区别是后者更可读。

在我看来,
\
将只匹配一系列单词字符,而
\b.*\b
将匹配一系列单词字符或一系列非单词字符,因为它也可以接受一个词的结尾,然后是一个词的开头。如果你强迫这两个词之间的表达成为一个词,它们的行为确实是一样的


当然,您可以使用
\b\w
\w\b
复制
\
\w\b
的行为。所以我想答案是肯定的,主要是为了可读性。再说一次,正则表达式中的大多数转义字符不就是为了这个吗?

如果假设它们的行为相同,您可能会得到意想不到的结果。
\b能做什么?
答案是
\
明确的。。。这是一个字的结尾!只有这一头
\b
常规的。。。。一个单词的两端都将匹配

GNU运营商*


它们也在GNU Grep和Vim中。
\
来自原始vi,并一直保留到今天。转义字符``从来都不是为了可读性。它用于区分正则表达式运算符与相同的文本字符glyph@fred-我的意思是转义字符,如
\w
\d
(而不是
\
本身)通常可以替换为字符类的其他字符,如
[0-9]
.Daniel:
\
将匹配由单词字符限定的任何字符串。
*
是贪婪的,因此匹配尽可能多的任意字符。要仅匹配单个单词,可以使用非贪婪变体:
\
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  |