Apa cara termudah untuk mencocokkan karakter non-ASCII dalam regex? Saya ingin mencocokkan semua kata satu per satu dalam string masukan, tetapi bahasanya mungkin bukan bahasa Inggris, jadi saya harus mencocokkan hal-hal seperti ü, ö, ß, dan ñ. Juga, ini dalam Javascript / jQuery, jadi solusi apa pun perlu diterapkan untuk itu.
javascript
jquery
regex
Paul Wicks
sumber
sumber
all words
membuatnya terdengar seperti Anda hanya menginginkan huruf non-Inggris dan tidak semua karakter non-Inggris seperti yang dinyatakan judul pertanyaan Anda.Jawaban:
Ini harus dilakukan:
Ini cocok dengan karakter apa pun yang tidak terkandung dalam rangkaian karakter ASCII (0-127, yaitu 0x0 hingga 0x7F).
Anda dapat melakukan hal yang sama dengan Unicode:
Untuk unicode Anda dapat melihat 2 sumber ini:
sumber
[\u00BF-\u1FFF\u2C00-\uD7FF\w]
sebagai surat.[\u00C0-\u1FFF\u2C00-\uD7FF\w]
(tanpa tanda tanya terbalik¿
), seperti untuk rentang, lihat BMP .00C0
adalahÀ
dalam Suplemen Latin-1 ,1FFF
adalah karakter terakhir dari Greek Extended,2C00
adalah huruf pertama dalam bahasa Glagolitik, danD7FF
merupakan karakter terakhir dalam Hangul Jamo Extended-B. Jadi itu semua kecuali: simbol dan karakter khusus pada 2 blok pertama; simbol di blok tengah; pengganti, area privat dan karakter khusus di blok akhir.Regex ini akan cocok dengan semua kata dalam teks bahasa apa pun ...
sumber
[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]
Situasi dengan regex, Unicode, dan Javascript menyebalkan. Sangat konyol bahwa programmer harus bergantung pada perpustakaan eksternal untuk mengenali bahwa "Αλφα" adalah sebuah kata, atau bahkan "é" adalah sebuah huruf.
Tapi begitulah.
Orang ini telah menulis perpustakaan yang baik untuk menangani Unicode di Javascript Regexes:
http://blog.stevenlevithan.com/archives/javascript-regex-and-unicode
Hal-hal Unicode adalah plugin untuk perpustakaan regex ini:
http://xregexp.com/
Berikut ini postingan tentang ekstensi Unicode:
http://blog.stevenlevithan.com/archives/xregexp-unicode-plugin
Dan halaman ekstensi itu sendiri:
http://xregexp.com/plugins/
Kerja bagus tetapi masih mengecewakan saya bahwa Javascript sangat mundur dalam hal ini.
(Dia menulis buku untuk O'Reilly tentang topik itu sehingga sangat mungkin dia tahu apa yang dia bicarakan.)
Cara dia mengimplementasikannya adalah dengan menambahkan tabel karakter dengan properti tertentu. Kemudian, ketika Anda membuat regex dengan perpustakaannya,
\p{charclass}
akan diganti dengan[allthecharactersintheclass]
.sumber
Unicode Property Escapes adalah salah satu fitur ES2018.
Penggunaan Dasar
Dengan Unicode Property Escapes, Anda dapat mencocokkan surat dari bahasa apa pun dengan ekspresi reguler sederhana berikut:
Atau dengan tulisan cepat, bahkan terser:
Kata-kata yang cocok
Mengenai kasus penggunaan konkret pertanyaan (kata-kata yang cocok), perhatikan bahwa Anda dapat menggunakan Unicode Property Escapes di kelas karakter, membuatnya mudah untuk mencocokkan huruf bersama - sama dengan karakter-kata lain seperti tanda hubung:
Menjahit semuanya, Anda bisa mencocokkan kata-kata dari semua [1] bahasa dengan RegEx pendek yang indah ini:
Contoh (tanpa malu-malu dicolokkan dari jawaban di atas ):
Dukungan Browser
Sampai sekarang (Desember 2018), saya hanya bisa menguji regex ini dengan sukses di Chrome (dan browser berbasis Blink lainnya, seperti Opera, Vivaldi atau versi Microsoft Edge yang akan datang) dan Safari (pada versi 12, Tes sebelumnya dengan versi 11 gagal). Namun, karena spesifikasi selesai dan fitur terstandarisasi, harap browser modern lain segera menyusul.
Saya membuat sedikit situs web untuk Anda periksa apakah browser Anda mendukung Unicode Property Escapes.
Transpiling
Unicode Property Escapes dapat dipindahkan ke ES5 dengan alat yang disebut regexpu . Ada demo online yang tersedia di sini . Seperti yang dapat Anda lihat di demo, Anda sebenarnya dapat mencocokkan huruf non-latin hari ini dengan ekspresi reguler ES5 berikut:
Jika Anda menggunakan Babel, ada juga plugin bertenaga regexpu untuk itu ( plugin Babel v6 , plugin Babel v7 ).
sumber
u
Bendera telah diperkenalkan di ES2015 dan memungkinkan berbagai fitur yang terkait dengan Unicode (misalnya, properti lolos disebutkan dalam jawaban saya, meskipun itu baru diperkenalkan beberapa tahun kemudian). Karena fitur terkait Unicode sedikit mengubah semantik dari beberapa pola regex, ini harus diaktifkan secara eksplisit - dengan menambahkanu
bendera itu.Jawaban yang diberikan oleh Jeremy Ruten sangat bagus, tapi saya pikir itu bukan apa yang dicari oleh Paul Wicks. Jika saya mengerti benar, Paul bertanya tentang ekspresi agar sesuai dengan kata-kata non-Inggris seperti
können
ataumóc
. Regex Jeremy hanya cocok dengan huruf non-Inggris, jadi perlu perbaikan kecil:atau
Ini
[^\x00-\x7F]
dan[^\u0000-\u007F]
bagian ini memungkinkan ekspresi regullar cocok dengan huruf non-Inggris.Ini
(|)
logis atau dan\w
adalah huruf bahasa Inggris, jadi([^\u0000-\u007F]|\w)
akan cocok dengan huruf bahasa Inggris atau bukan bahasa Inggris.+
pada akhir ungkapan berarti itu bisa diulang, sehingga seluruh ekspresi memungkinkan semua huruf bahasa Inggris atau non-bahasa Inggris cocok.Di sini Anda dapat menguji ekspresi pertama dengan berbagai string dan di sini adalah yang kedua.
sumber
Anda melakukan cara yang sama seperti pencocokan karakter lain, tetapi Anda menggunakan \ uXXXX di mana XXXX adalah nomor unicode karakter.
Lihatlah: http://unicode.org/charts/charindex.html
http://unicode.org/charts/
http://www.decodeunicode.org/
sumber
Semua rasa Regex yang diaktifkan Unicode harus memiliki kelas karakter khusus seperti \ w yang cocok dengan huruf Unicode apa pun. Lihatlah rasa spesifik Anda di sini .
sumber
Saya punya masalah dengan \ p bekerja seperti yang diharapkan, jadi saya hanya menggunakan strategi yang berbeda seperti:
Temukan apa pun yang bukan karakter tab hingga karakter tab berikutnya ... jelas ini tergantung pada sumber pencarian Anda, tetapi Anda mendapatkan idenya. Sekarang saya tidak perlu mencari tahu apa karakter unicode bekerja dan tidak berfungsi dll.
sumber