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 |