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

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

13 голосов
/ 14 января 2010

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

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

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

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

Ответы [ 2 ]

18 голосов
/ 14 января 2010

Попробуйте это:

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

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

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

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

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

ОК, я очень повеселился с юникодом в php-аромате PCRE: D Пикабу говорит, что доступно простое решение:

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

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

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

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

3 голосов
/ 14 января 2010

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

...