Подтвердить что ты не робот

RegEx:\w - "_" + "-" в UTF-8

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

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

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

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

4b9b3361

Ответ 1

Попробуйте следующее:

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

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

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

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

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

Хорошо, мне было очень весело с unicode в php-стиле PCRE: D Peekaboo говорит, что есть простое решение:

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

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

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

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

Ответ 2

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