Если у меня есть предложение, и я хочу показать слово или все слова после того, как перед ним подобрано определенное слово, например, я хотел бы отобразить слово fox
после brown
The quick brown fox jumps over the lazy dog
, я знаю, что я могу выглядеть позитивно (?<=brown\s)(\w+)
однако я не совсем понимаю использование \b в экземпляре (?<=\bbrown\s)(\w+)
. Я использую http://gskinner.com/RegExr/ в качестве моего тестера.
Как работает \b при использовании регулярных выражений?
Ответ 1
\b
- это нуль с утверждением. Это означает, что он не соответствует характеру, он соответствует позиции с одной вещью с левой стороны и другой с правой стороны.
Граница слова \b
соответствует изменению от \w
(символа слова) до символа \w
несловного символа или от \w
до \w
Какие символы включены в \w
, зависит от вашего языка. По крайней мере, есть все буквы ASCII, все ASCII-номера и символ подчеркивания. Если ваш механизм регулярных выражений поддерживает unicode, возможно, все буквы и числа в \w
имеют букву или номер свойства юникода.
\w
- все символы, которые НЕ находятся в \w
.
\bbrown\s
будет соответствовать здесь
The quick brown fox
^^
но не здесь
The quick bbbbrown fox
потому что между b и коричневым цветом нет границы слова, то есть нет изменения от символа несловного символа слова, оба символа включены в \w
.
Если ваше регулярное выражение приходит к \b
, оно переходит к следующему char, то есть b
от коричневого. Теперь \b
знает, что на правой стороне, слово char == > the b
. Но теперь нужно оглянуться назад, чтобы \b
стал ИСТИННЫМ, перед b
должен быть символ без слова. Если есть пробел (то есть не в \w
), то \b
перед b
является истинным. НО, если есть еще один b
, тогда его false, а затем \bbrown
не соответствует "bbrown"
Регулярное выражение brown
будет соответствовать обеим строкам "быстрый коричневый" и "bbrown" , где регулярное выражение \bbrown
соответствует только "быстрому коричневому" и не "bbrown"
Подробнее см. здесь www.regular-expressions.info
Ответ 2
Символ \b
является особым. Это не соответствует характеру. То, что он делает, это соответствие любой позиции, которая лежит на границе слова (где "слово" в этом случае - это все, что соответствует \w
). Таким образом, шаблон (?<=brown\s)(\w+)
будет соответствовать "bbbbrown fox", но (?<=\bbrown\s)(\w+)
не будет, поскольку позиция между "bb" и "brown" находится посредине слова, а не на его границе.
Ответ 3
\ b гарантирует, что коричневый цвет находится на границе слова, эффективно исключая шаблоны, такие как
blackandbrown
Ответ 4
Вам не нужен внешний вид, вы можете просто использовать:
(\bbrown\s)(\w+)
Ответ 5
\ b является "границей слов" и является позицией между началом или концом слова, а затем "не-словными" символами.
Его основное использование - упростить выбор целого слова до \bbrown\s
будет соответствовать:
^ коричневый коричневый 99brown _brown
Его более или менее эквивалентно "\ W *", за исключением случаев, когда "захват" строк как "\ b" соответствует началу слова, а не символу без слова, предшествующему или следующему за словом.
Ответ 6
\b
- это соответствие нулевой ширины границы слова.
(Либо начало конца слова, где "слово" определяется как \w+
)
Примечание: "нулевая ширина" означает, что \b
находится в пределах регулярного выражения, которое соответствует, оно не добавляет никаких символов в текст, захваченный этим совпадением. т.е. регулярное выражение \bfoo\b
при совпадении будет захватывать только "foo"
- хотя \b
способствовало тому, как foo был сопоставлен (т.е. как целое слово), он не вносил никаких символов.
Ответ 7
Граница слов - это позиция, которая либо предшествует символу слова, либо не сопровождается символом слова или не предшествует символу слова. Это эквивалентно этому:
(?<=\w)(?!\w)|(?=\w)(?<!\w)
... или это должно быть. См. этот вопрос для всего, что вам когда-либо хотелось узнать о границах слов.;)