Jaki jest najłatwiejszy sposób dopasowania znaków spoza ASCII w wyrażeniu regularnym? Chciałbym dopasować wszystkie słowa osobno w ciągu wejściowym, ale językiem może nie być angielski, więc będę musiał dopasować takie elementy, jak ü, ö, ß i ñ. Jest to również w Javascript / jQuery, więc każde rozwiązanie będzie musiało się do tego zastosować.
javascript
jquery
regex
Paul Wicks
źródło
źródło
all words
, brzmi to tak, jakbyś chciał tylko liter nieanglojęzycznych, a nie wszystkich znaków innych niż angielski, jak podaje tytuł pytania.Odpowiedzi:
To powinno to zrobić:
Pasuje do każdego znaku, który nie jest zawarty w zestawie znaków ASCII (0-127, tj. Od 0x0 do 0x7F).
Możesz zrobić to samo z Unicode:
W przypadku Unicode możesz przejrzeć te 2 zasoby:
źródło
[\u00BF-\u1FFF\u2C00-\uD7FF\w]
jako list.[\u00C0-\u1FFF\u2C00-\uD7FF\w]
(bez odwróconego znaku zapytania¿
), podobnie jak w przypadku zakresów, patrz BMP .00C0
jestÀ
w dodatku Latin-1 ,1FFF
jest ostatnim znakiem greckiego rozszerzonego,2C00
jest pierwszą literą w języku głagolicy iD7FF
ostatnim znakiem w Hangul Jamo Extended-B. To wszystko oprócz: symboli i znaków specjalnych na 2 pierwszych blokach; symbole w środkowych blokach; surogaty, strefa prywatna i znaki specjalne w blokach końcowych.Ten regex dopasuje wszystkie słowa w tekście dowolnego języka ...
źródło
[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]
Sytuacja z wyrażeniami regularnymi, Unicode i JavaScript jest do kitu. To niedorzeczne, że programiści powinni polegać na bibliotekach zewnętrznych, aby rozpoznać, że „Αλφα” to słowo, a nawet, że „é” to litera.
Ale tak to idzie.
Ten facet napisał dobrą bibliotekę do obsługi Unicode w JavaScript Regexes:
http://blog.stevenlevithan.com/archives/javascript-regex-and-unicode
Rzeczy w Unicode to wtyczka do tej biblioteki wyrażeń regularnych:
http://xregexp.com/
Oto post o rozszerzeniu Unicode:
http://blog.stevenlevithan.com/archives/xregexp-unicode-plugin
I sama strona rozszerzenia:
http://xregexp.com/plugins/
Świetna robota, ale wciąż mnie denerwuje, że Javascript jest pod tym względem bardzo zacofany.
(Napisał książkę dla O'Reilly na ten temat, więc jest całkiem możliwe, że wie o czym mówi).
Zaimplementował to, dodając tabele znaków o określonych właściwościach. Następnie, gdy konstruujesz wyrażenie regularne w jego bibliotece,
\p{charclass}
zostaje zastąpione przez[allthecharactersintheclass]
.źródło
Ucieka właściwość Unicode należą do funkcji ES2018.
Podstawowe użycie
Za pomocą znaków ucieczki właściwości Unicode można dopasować literę z dowolnego języka za pomocą następującego prostego wyrażenia regularnego:
Lub za pomocą skrótu, nawet jeszcze krótszego:
Dopasowane słowa
Jeśli chodzi o konkretny przypadek użycia pytania (dopasowanie słów), należy pamiętać, że można używać znaków ucieczki właściwości Unicode w klasach znaków, co ułatwia dopasowanie liter razem z innymi znakami słów, takimi jak łączniki:
Łącząc to wszystko razem, możesz dopasować słowa wszystkich [1] języków za pomocą tego pięknie krótkiego RegEx:
Przykład (bezwstydnie podłączony do powyższej odpowiedzi ):
Obsługa przeglądarki
Na dzień dzisiejszy (grudzień 2018 r.) Mogłem tylko z powodzeniem przetestować ten regex w Chrome (i innych przeglądarkach opartych na Blink, takich jak Opera, Vivaldi lub przyszłe wersje Microsoft Edge) i Safari (od wersji 12, wcześniejsze Testy z wersją 11 nie powiodło się). Ponieważ jednak specyfikacja jest zakończona, a funkcja jest znormalizowana, spodziewaj się, że wkrótce pojawią się inne nowoczesne przeglądarki.
Zrobiłem małą stronę internetową , aby sprawdzić, czy twoja przeglądarka obsługuje zmiany właściwości Unicode.
Transpiling
Ucieczki właściwości Unicode można przenosić do ES5 za pomocą narzędzia o nazwie regexpu . Jest takie demo on-line dostępne są tutaj . Jak widać w wersji demo, w rzeczywistości można dziś dopasować litery niełacińskie z następującym (okropnie długim) wyrażeniem regularnym ES5:
Jeśli używasz Babel, tam również plugin regexpu zasilany za to ( Babel v6 wtyczki , Babel v7 plugin ).
źródło
u
Flaga została wprowadzona w ES2015 i umożliwia różne funkcje związane z Unicode (np. Znaki ucieczki własności wspomniane w mojej odpowiedzi, nawet jeśli zostały wprowadzone dopiero kilka lat później). Ponieważ funkcje związane z Unicode nieznacznie zmieniają semantykę niektórych wzorców wyrażeń regularnych, należy to wyraźnie włączyć - dodając tęu
flagę.Odpowiedź udzielona przez Jeremy Ruten jest świetna, ale myślę, że nie do końca szukał tego Paul Wicks. Jeśli dobrze rozumiem, Paul zapytał o wyrażenie pasujące do słów innych niż angielskie, takich jak
können
lubmóc
. Wyrażenie regularne Jeremy'ego pasuje tylko do liter nieanglojęzycznych, więc potrzeba drobnej poprawy:lub
Ta
[^\x00-\x7F]
i te[^\u0000-\u007F]
części pozwalają, aby wyrażenie regularne pasowało do liter innych niż angielskie.Jest
(|)
to logiczne lub\w
angielskie litery, więc([^\u0000-\u007F]|\w)
będą pasować do pojedynczej litery angielskiej lub innej niż angielska.+
na końcu wyrażenia oznacza, że można go powtórzyć, więc całe wyrażenie pozwala na dopasowanie wszystkich liter angielskich lub nieanglojęzycznych.Tutaj możesz przetestować pierwsze wyrażenie z różnymi ciągami, a tutaj jest drugie.
źródło
Robisz to samo, co w przypadku każdego innego dopasowania znaków, ale używasz \ uXXXX, gdzie XXXX jest numerem Unicode znaku.
Spójrz na: http://unicode.org/charts/charindex.html
http://unicode.org/charts/
http://www.decodeunicode.org/
źródło
Wszystkie smaki Regex z obsługą Unicode powinny mieć specjalną klasę znaków, taką jak \ w, pasującą do dowolnej litery Unicode. Spójrz na swój specyficzny smak tutaj .
źródło
Miałem problem z \ p działaniem zgodnie z oczekiwaniami, więc użyłem innej strategii, takiej jak:
Znajdź coś, co nie jest znakiem tabulacji, dopóki nie pojawi się następny znak tab ... oczywiście zależy to od źródła wyszukiwania, ale masz pomysł. Teraz nie muszę się zastanawiać, jakie znaki Unicode działają i nie działają itp.
źródło