Мне нужно регулярное выражение, которое соответствует буквам и цифрам UTF-8, тире ( -
), но не соответствует символам подчеркивания ( _
), я пробовал эти глупые попытки без успеха:
([\w-^_])+
([\w^_]-?)+
(\w[^_]-?)+
\w
является сокращением для [A-Za-z0-9_]
, но также соответствует [A-Za-z0-9_]
UTF-8, если у меня есть набор модификаторов u
.
Может ли кто-нибудь помочь мне с этим?
Попробуй это:
(?:[\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:] -] +, когда установлен правильный языковой стандарт.