\b
- утверждение нулевой ширины, которое означает границы слова . Эти позиции символов (взятые из этой ссылки) считаются границами слов:
- Перед первым символом в строке, если первый символ является символом слова.
- После последнего символа в строке, если последний символ является символом слова.
- Между двумя символами в строке, где один является символом слова, а другой не является символом слова.
Символы слова, конечно, любые \w
. s
- это символ слова, а '
- нет. В приведенном выше примере область между '
и s
является границей слова.
Строка "Jon's"
выглядит следующим образом, если я выделю якоря и границы (первый и последний \b
s находятся в тех же позициях, что и ^
и $
): ^Jon\b'\bs$
Отрицательное утверждение за заявлением (?<!s)\b
означает, что оно будет соответствовать границе слова, только если ей не предшествует буква s
(т.е. последний символ слова не является s
). Таким образом, он ищет границу слова при определенном условии.
Поэтому первое регулярное выражение работает так:
\b\w+
соответствует первым трем буквам J
o
n
.
На самом деле есть еще одна граница слова между n
и '
, как показано выше, поэтому (?<!s)\b
соответствует этой границе слова , поскольку ей предшествует n
, а не s
.
Поскольку достигнут конец шаблона, итоговое совпадение будет Jon
.
Дополнительный класс символов [^s]\b
означает, что он будет соответствовать любому символу, который не является буквой s
, за которой следует граница слова. В отличие от вышеизложенного, здесь выполняется поиск одного символа, за которым следует граница слова.
Поэтому второе регулярное выражение работает так:
\b\w+
соответствует первым трем буквам J
o
n
.
Так как '
- это не буква s
(соответствует классу символов [^s]
), и за ней следует граница слова (между '
и s
), она совпадает.
Поскольку достигнут конец шаблона, результирующее совпадение равно Jon'
. Буква s
равна , а не , потому что граница слова до того, как она уже найдена.