Регулярное выражение: w-"" +"-"в UTF-8
Мне нужно регулярное выражение, которое соответствует буквам и цифрам UTF-8, знаку тире (-
), но не соответствует символам подчеркивания (_
), я безуспешно пробовал эти глупые попытки:
([\w-^_])+
([\w^_]-?)+
(\w[^_]-?)+
\w
является сокращением для [A-Za-z0-9_]
, но оно также соответствует символам UTF-8, если у меня установлен модификатор u
.
Может ли кто-нибудь помочь мне с этим?
2 answers
Попробуйте это:
(?:[\w\-](?<!_))+
Он выполняет простое сопоставление со всем, что закодировано как \w (или тире), а затем имеет вид с нулевой шириной, который гарантирует, что только что сопоставленный символ не является подчеркиванием.
В противном случае вы могли бы выбрать этот вариант:
(?:[^_\W]|-)+
Который является более основанным на множестве подходом (обратите внимание на заглавную букву W)
Хорошо, мне было очень весело с юникодом в стиле php PCREs:D Ку-ку говорит, что есть простое доступное решение:
[\p{L}\p{N}\-]+
\п{Л} соответствует всему юникоду, который квалифицируется как буква (примечание: не символ слова, поэтому подчеркивания отсутствуют), в то время как \p{N} соответствует всему, что выглядит как число (включая римские цифры и более экзотические вещи).
\- это просто сбежавшая черточка. Хотя это и не является строго необходимым, я стараюсь избегать тире в классах персонажей... Обратите внимание, что в юникоде есть десятки различных тире, что приводит к следующей версии:
[\p{L}\p{N}\p{Pd}]+
Где "Pd" - Знак препинания, Тире, включая, но не ограничиваясь нашей минус-черточкой. (Обратите внимание, здесь снова нет подчеркивания).
Я не уверен, какой язык вы используете, но на PERL вы можете просто написать: [[:alnum:]-]+, когда установлена правильная локаль.