2013-01-16 3 views
2

У меня только немного понятие о \B и \b. И accordinlgy попробовал код (взятый из Интернета), но не мог понять, что - как результат был сгенерирован этими regexp Anchors. Так что, пожалуйста, помогите мне разобраться в разнице между \B и \b, говоря внутренне, как они подходят в pattern matching в Ruby?Как Regexp якоря B и b отличаются друг от друга?

Interactive ruby ready. 
> str = "Hit him on the head\­n" + 
     "Hit him on the head with a 2×4\n­" 
=> "Hit him on the head 
Hit him on the head with a 2??4 
" 
> str.scan(/­\w+\B/) 
=> ["Hi", "hi", "o", "th", "hea", "Hi", "hi", "o", "th", "hea", "wit"] 
> str.scan(/­\w+\b/) 
=> ["Hit", "him", "on", "the", "head", "Hit", "him", "on", "the", "head", "with", "a", "2", "4"] 
> 

Спасибо,

+0

Почему в вышестоящем выводе 'str' пришел как' 2 ?? 4' вместо '2x4'? – DoLoveSky

ответ

6

Подобно большинству низших пар/верхний регистр, они строго противоположны:

\b совпадает с границей слово - то есть, он соответствует между две буквы (с это совпадение нулевой ширины, т. е. оно не потребляет символ при сопоставлении), где один принадлежит слову, а другой - нет. В тексте «this person», \b будет соответствовать следующим позициям (обозначается вертикальной полосой): «|this| |person|».

\B соответствует в любом месте на границе с текстом. Он будет соответствовать этим позициям: «t|h|i|s p|e|r|s|o|n» - то есть между всеми буквами, но не между буквой и небуквенным символом.

Так что если у вас есть \w+\b и матч «this person«, то вы получите в результате „this“, потому что + жаден и соответствует столько символов слова (\w), насколько это возможно, до следующей границы слова.

\w+\B работает аналогичным образом, но это не может сравниться с «this», так что следует за границей слова, которые \B запрещает. Таким образом, двигатель отступает один символ и вместо этого соответствует «thi».

+0

Я не понимаю, но частично! Можно ли визуализировать то, что вы сказали в сообщении. Который может быть полезен, чтобы иметь концепцию в моем уме быстро! Также короткая идея с моим exapmle 'то, что границы слова 'в моих примерах звонков? – DoLoveSky

+0

@DoLoveSky Лучшая визуализация, о которой я могу думать, на самом деле такова во втором и третьем абзацах, где я показал потенциальные совпадающие позиции двух выражений с использованием вертикальных баров. –

+0

http://www.regular-expressions.info/engine.html @DoLoveSky, как только вы получили реалистичную идею о том, как двигатели регулярных выражений соответствуют выражениям, вы легко поймете все, что связано с регулярным выражением. Я настоятельно рекомендую вам начать работу. – nicooga

Смежные вопросы