2016-10-28 5 views
7

Я изучаю регулярное выражение. Но я не могу понять «\ b», сопоставить границу слова. есть три ситуации, например:Как понять регулярное выражение ' b'?

  1. Перед первым символом в строке, если первый символ является символом слова.
  2. После последнего символа в строке, если последний символ является символом слова.
  3. Между двумя символами в строке, где один является символом слова, а другой не является символом слова.

Я не могу понять, третий situation.for пример:

var reg = /end\bend/g; 
var string = 'wenkend,end,end,endend'; 
alert(reg.test(string)) ; //false 

Применение '\ Ь' требуют '\ W' символ в одной его стороне, другой не '\ ш' символ в другая сторона . строка «end, end» должна соответствовать правилу, после первого символа будет строка «,», перед тем как последний символ будет строкой «,», поэтому почему результат - ошибка. Не могли бы вы помочь, спасибо заранее!

============ разделительные линии =============

С вашей помощью, я это понимаю. «конец, конец» совпадают с первым «концом» и имеют границу, но следующий символ «,» не «e», поэтому «/ end \ bend» является ложным.

Другими словами, reg '/ end \ bend/g' или другие подобные reg не выходят навсегда. Еще раз спасибо

+0

'\ b' ничего не – Steve

+0

Ваше регулярное выражение должно быть'/конец \ б захвата, \ сгиб/G' –

+5

'\ b' не совпадает с характером, он совпадает с точкой между символами, границей. Невозможно, чтобы там была граница слов, когда два символа рядом с символом '\ b' - оба символа слова. Регулярное выражение, которое вы, возможно, думаете, это '/ end \ Wend/g' – 4castle

ответ

4

\b соответствует положению, а не персонажу. Таким образом, это регулярное выражение /end\bend/g говорит, что должна быть строка end. Затем за ним должен следовать символ слова, который равен ,, и он соответствует, но механизм регулярных выражений не перемещается в строке, и он остается на ,. Итак, следующий символ в вашем регулярном выражении - e, а e не соответствует ,. Поэтому regexp терпит неудачу. Вот шаг за шагом, что происходит:

----------------- 
/end\bend/g, "end,end"  (match) 
    |    | 
----------------- 

/end\bend/g, "end,end"  (both regex and string position moved - match) 
    |    | 
------------------ 

/end\bend/g, "end,end"  (the previous match was zero-length, so only regex position moved - not match) 
     |   | 
0

Попробуйте это выражение

/(end)\b|\b(end)/g 
+0

Чтобы получить четкое представление о том, как работает регулярное выражение –

+0

Попробуйте использовать http://regexr.com/ –

+2

Цель здесь состоит не в том, чтобы вручить им рыбу, а в том, чтобы научить человека ловить рыбу. Этот ответ не помогает. – 4castle

3

С (в большинстве) регулярных выражений двигателей, вы можете матч, захват символов и утверждают, позиции в пределах строки.

Для этого примера предположим строку

Rogue One: A Star Wars Story 

, где вы хотите, чтобы соответствовать характеру o (что там дважды, после R и после t). Теперь вы хотите указать позицию и хотите соответствовать o s только до нижнего регистра r s.
Вы пишете (с положительным предпросмотром):

o(?=r) 

Теперь обобщается понятием нулевой шириной утверждений, где вы хотите, чтобы искать слова персонажа вперед, удостоверившись, что нет ни одного слова символа сразу за , Поэтому вы можете написать:

(?=\w)(?<!\w) 

Положительный и отрицательный взгляд в сочетании.Мы почти :) Вам нужно только то же самое вокруг (слово символов позади и не слово символа впереди), который:

(?<=\w)(?!\w) 

Если объединить эти два, вы будете в конечном итоге получить (увидеть | в середине):

(?:(?=\w)(?<!\w)|(?<=\w)(?!\w)) 


что эквивалентно \b (и намного дольше). Возвращаясь к нашей строке, это верно для:

Rogue One: A Star Wars Story 
# right before R 
# right after e in Rogue 
# right before O of One 
# right after e of One (: is not a word character) 
# and so on... 

См a demo on regex101.com.


В заключение, вы можете представить \b как утверждение с нулевой шириной, которое обеспечивает только положение внутри строки.

+1

FYI, [tchrist's answer] (http: // stackoverflow.com/a/4215293/3832970) также описывает, что «условное» (фактически, контекстуальное) поведение границы слова. –

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