Регулярное выражение: разница между отрицательным взглядом позади и отрицанием - PullRequest
3 голосов
/ 02 сентября 2011

С регулярные выражения.инфо :

\b\w+(?<!s)\b.Это определенно не то же самое, что \b\w+[^s]\b.Применительно к Jon's первое совпадет с Jon, а второе Jon' (включая апостроф).Я оставлю это на ваше усмотрение, чтобы выяснить, почему.(Подсказка: \ b соответствует апострофу и символам s).Последнее также не будет соответствовать однобуквенным словам, таким как «а» или «я».

Можете ли вы объяснить, почему?

Кроме того, вы можете уточнить, что именно \bи почему он совпадает между апострофом и s?

Ответы [ 2 ]

7 голосов
/ 02 сентября 2011

\b - утверждение нулевой ширины, которое означает границы слова . Эти позиции символов (взятые из этой ссылки) считаются границами слов:

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

Символы слова, конечно, любые \w. s - это символ слова, а ' - нет. В приведенном выше примере область между ' и s является границей слова.

Строка "Jon's" выглядит следующим образом, если я выделю якоря и границы (первый и последний \b s находятся в тех же позициях, что и ^ и $): ^Jon\b'\bs$

Отрицательное утверждение за заявлением (?<!s)\b означает, что оно будет соответствовать границе слова, только если ей не предшествует буква s (т.е. последний символ слова не является s). Таким образом, он ищет границу слова при определенном условии.

Поэтому первое регулярное выражение работает так:

  1. \b\w+ соответствует первым трем буквам J o n.

  2. На самом деле есть еще одна граница слова между n и ', как показано выше, поэтому (?<!s)\b соответствует этой границе слова , поскольку ей предшествует n, а не s.

  3. Поскольку достигнут конец шаблона, итоговое совпадение будет Jon.

Дополнительный класс символов [^s]\b означает, что он будет соответствовать любому символу, который не является буквой s, за которой следует граница слова. В отличие от вышеизложенного, здесь выполняется поиск одного символа, за которым следует граница слова.

Поэтому второе регулярное выражение работает так:

  1. \b\w+ соответствует первым трем буквам J o n.

  2. Так как ' - это не буква s (соответствует классу символов [^s]), и за ней следует граница слова (между ' и s), она совпадает.

  3. Поскольку достигнут конец шаблона, результирующее совпадение равно Jon'. Буква s равна , а не , потому что граница слова до того, как она уже найдена.

1 голос
/ 02 сентября 2011

В этом примере мы пытаемся продемонстрировать, что для создания условий "и" можно использовать предпросмотры и взгляды.


\b\w+(?<!s)\b

также можно записать как

\b\w*\w(?<!s)\b

дает нам

\b\w*[^s]\b    vs    \b\w*\w(?<!s)\b

Я сделал это, чтобы мы могли игнорировать несущественные.(\b - это просто отвлечение внимания в этом примере.) У нас есть

[^s]    vs    \w(?<!s)

С левой стороны, мы можем сопоставить любой символ , кроме "s"

Вкл.верно, мы можем сопоставить любой символ слова , кроме "s"

Кстати,

\w(?<!s)

также может быть написано

(?!s)\w      # Not followed by "s" and followed by \w
...