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:]-]+, когда установлена ​​правильная локаль.

Другие вопросы по тегам