Регулярное выражение Emacs: что \ <и \> может сделать то, что \ b не может сделать? - PullRequest
10 голосов
/ 30 апреля 2011

Regexp Backslash - GNU Emacs Manual говорит, что \< соответствует началу слова, \> соответствует концу слова, а \b соответствует границе слова \b так же, как и в других регулярных выражениях не-Emacs. Но кажется, что \< и \> являются частными для регулярных выражений Emacs. Есть ли случаи, когда вместо \b нужны \< и \>? Например, \bword\b будет соответствовать так же, как \<word\>, и единственное отличие состоит в том, что последний является более читабельным.

Ответы [ 2 ]

12 голосов
/ 01 мая 2011

Вы можете получить неожиданные результаты, если предположите, что они ведут себя одинаково ..
Что может \ <и> то, что может сделать \ b?
Ответ таков: \< и \> равны явный ... это конец слова!и только этот конец!
\b равен general .... Любой конец слова будет соответствовать ...

Операторы GNU * Операторы слова

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  |
2 голосов
/ 01 мая 2011

Мне кажется, что \<.*?\> будет соответствовать только серии символов слова, в то время как \b.*?\b будет соответствовать либо серии символов слова, либо серии несловесных символов, поскольку он также может принимать конец слова, и затем начало одного. Если вы заставите выражение между ними быть словом, они действительно будут действовать одинаково.

Конечно, вы можете повторить поведение \< и \> с \b\w и \w\b. Так что я думаю, что ответ - да, это в основном для удобства чтения. Опять же, разве это не то, для чего большинство escape-символов в регулярном выражении?

...