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