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

Мне нужно регулярное выражение, которое соответствует буквам и цифрам 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:] -] +, когда установлен правильный языковой стандарт.