\ P {L} эквивалентно [^ \ d \ s] - PullRequest
1 голос
/ 21 июня 2020

Для сопоставления букв эквивалентны ли эти два регулярных выражения? Один вообще предпочтительнее? Или это случай «это зависит от обстоятельств»?

1. Сокращенный код буквы юникода:

\p{L}

2. Отрезанный PCRE короткие коды для цифр и пробелов:

[^\d\s]

Ответы [ 2 ]

3 голосов
/ 21 июня 2020

Они не эквивалентны.

Если вы используете опцию u, \p{L} означает «буква (Категория L)». [^\s\d] означает «не пробел (Категория Z) и не di git (Категория Nd)». Если каждый персонаж действительно принадлежит к одной из трех категорий, то вы были бы правы из-за теории множеств, но есть символы, которые не принадлежат ни к одной из трех категорий.

Запятая ,, например, пунктуация (Категория P), и будет соответствовать [^\s\d], но не \p{L}.

Фактически, существует лот более 3 категорий в Юникоде.

Итак, чтобы на самом деле использовать отрицание для представления \p{L}, вы должны сказать:

[^\p{C}\p{M}\p{N}\p{P}\p{S}\p{Z}]

в основном перечисляются все остальные категории. Но он сломается, как только Unicode решит добавить новую категорию и PCRE решит поддержать его. Излишне говорить, что пожалуйста, не используйте его в производстве :)

1 голос
/ 21 июня 2020

Контраст между двумя регулярными выражениями разительный:

Регулярное выражение \p{L} соответствует любой букве (отсюда L), а не только латинскому и греческому алфавиту, как \w, но также и любого другого алфавита.

Класс инвертированных символов [^\d\s] соответствует всему, что является не числом 0-9, а не табуляцией, новой строкой, вертикальной табуляция, подача формы, возврат каретки, пробел и, возможно, другие символы, зависящие от локали. один тип символов.

...