Регулярное выражение: w-"" +"-"в UTF-8


Мне нужно регулярное выражение, которое соответствует буквам и цифрам UTF-8, знаку тире (-), но не соответствует символам подчеркивания (_), я безуспешно пробовал эти глупые попытки:

  • ([\w-^_])+
  • ([\w^_]-?)+
  • (\w[^_]-?)+

\w является сокращением для [A-Za-z0-9_], но оно также соответствует символам UTF-8, если у меня установлен модификатор u.

Может ли кто-нибудь помочь мне с этим?

Author: Alix Axel, 2010-01-14

2 answers

Попробуйте это:

(?:[\w\-](?<!_))+

Он выполняет простое сопоставление со всем, что закодировано как \w (или тире), а затем имеет вид с нулевой шириной, который гарантирует, что только что сопоставленный символ не является подчеркиванием.

В противном случае вы могли бы выбрать этот вариант:

(?:[^_\W]|-)+

Который является более основанным на множестве подходом (обратите внимание на заглавную букву W)

Хорошо, мне было очень весело с юникодом в стиле php PCREs:D Ку-ку говорит, что есть простое доступное решение:

[\p{L}\p{N}\-]+

\п{Л} соответствует всему юникоду, который квалифицируется как буква (примечание: не символ слова, поэтому подчеркивания отсутствуют), в то время как \p{N} соответствует всему, что выглядит как число (включая римские цифры и более экзотические вещи).
\- это просто сбежавшая черточка. Хотя это и не является строго необходимым, я стараюсь избегать тире в классах персонажей... Обратите внимание, что в юникоде есть десятки различных тире, что приводит к следующей версии:

[\p{L}\p{N}\p{Pd}]+

Где "Pd" - Знак препинания, Тире, включая, но не ограничиваясь нашей минус-черточкой. (Обратите внимание, здесь снова нет подчеркивания).

 18
Author: gha.st, 2013-07-06 08:56:24

Я не уверен, какой язык вы используете, но на PERL вы можете просто написать: [[:alnum:]-]+, когда установлена правильная локаль.

 3
Author: Jiri Klouda, 2010-01-14 05:53:03