Они не эквивалентны.
Если вы используете опцию 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 решит поддержать его. Излишне говорить, что пожалуйста, не используйте его в производстве :)