2010-01-14 6 views
12

Potrzebuję wyrażenie regularne, które pasuje do liter i cyfr UTF-8, znak kreski (-), ale nie pasuje do podkreśleń (_), I próbowałem te głupie próby bez powodzenia:RegEx: w - "_" + "-" w UTF-8

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

\w jest skrótem f lub [A-Za-z0-9_], ale pasuje również do znaków UTF-8, jeśli mam zestaw modyfikujący u.

Czy ktoś może mi pomóc z tym?

+1

Proszę określić "litery UTF-8" - czy możesz potwierdzić, że chcesz nie tylko angielskich znaków? –

+0

@meder: Chcę angielskie ** i ** znaki akcentowane/obce. –

Odpowiedz

17

Spróbuj tego:

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

To nie prosty mecz o wszystko, co jest zakodowany jako \ W (lub myślnikiem), a następnie ma zerowej szerokości lookbehind, który zapewnia, że ​​postać, która została właśnie dopasowane nie jest podkreśleniem.

przeciwnym razie można wybrać ten jeden:

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

który jest podejście bardziej ustawić oparte (zwróć uwagę na wielkie litery W)

OK, miałem dużo zabawy z unicode w smaku PHP z PCREs: D Peekaboo mówi, że nie jest to proste rozwiązanie dostępne:

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

\ p {L} pasuje coś Unicode, który kwalifikuje jako list (uwaga: nie znak słowny, w związku z tym bez podkreśleń), podczas gdy \ p {N} pasuje do wszystkiego, co wygląda jak liczba (w tym cyfry rzymskie i bardziej egzotyczne rzeczy).
\ - jest tylko ucieczką. Chociaż nie jest to bezwzględnie konieczne, staram się uczynić z niego punkt ucieczki kreski w klasach znaku ... Zauważ, że istnieją dziesiątki różnych kresek w Unicode, co daje podstawy do następującej wersji:

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

Gdzie " Pd "to znak interpunkcyjny, w tym między innymi nasz minus-kreska. (Uwaga, znowu nie podkreślenia tutaj).

+0

negowanie \ W nie uwzględnia hiper? – codaddict

+0

@dionadar - to nie pasuje do znaków akcentowanych dla mnie. –

+1

@codadict Z tego, co wiem, łącznik nie jest zawarty w \ w - i nawet gdyby był, nie zaszkodzi by go tak określić;) –

3

Nie jestem pewien, jakiego języka używasz, ale w PERL możesz po prostu napisać: [[: alnum:] -] + gdy ustawione jest prawidłowe ustawienie narodowe.

+0

Miło wiedzieć, ale używam PHP (silnika PCRE). –

+0

Próbowałem w PHP i Rubular (Ruby), zobacz http://www.rubular.com/regexes/12922 i http://www.rubular.com/regexes/12923. –

+0

Poprawiłem tam mały błąd. –