Bagikan melalui


Sintaks regex

Berlaku untuk: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft Sentinel

Artikel ini menyediakan gambaran umum sintaks ekspresi reguler yang didukung oleh Bahasa Kueri Kusto (KQL).

Ada sejumlah operator dan fungsi KQL yang melakukan pencocokan string, pemilihan, dan ekstraksi dengan ekspresi reguler, seperti matches regex, parse, dan replace_regex().

Di KQL, ekspresi reguler harus dikodekan sebagai literal string dan mengikuti aturan kutipan string. Misalnya, ekspresi \A reguler diwakili dalam KQL sebagai "\\A". Garis miring terbelakang ekstra menunjukkan bahwa garis miring terbelakang lainnya adalah bagian dari ekspresi \Areguler .

Sintaks

Bagian berikut mendokumen sintaks ekspresi reguler yang didukung oleh Kusto.

Cocokkan satu karakter

Pola Deskripsi
. Karakter apa pun kecuali baris baru (menyertakan baris baru dengan bendera s)
[0-9] Digit ASCII apa pun
\d Digit (\p{Nd})
\D Bukan digit
\pX Kelas karakter Unicode diidentifikasi dengan nama satu huruf
\p{Greek} Kelas karakter Unicode (kategori umum atau skrip)
\PX Kelas karakter Unicode yang dinegasikan diidentifikasi dengan nama satu huruf
\P{Greek} Kelas karakter Unicode yang dinegasikan (kategori umum atau skrip)

Kelas karakter

Pola Deskripsi
[xyz] Kelas karakter yang cocok baik x, y atau z (union).
[^xyz] Kelas karakter yang cocok dengan karakter apa pun kecuali x, y, dan z.
[a-z] Kelas karakter yang cocok dengan karakter apa pun dalam rentang a-z.
[[:alpha:]] Kelas karakter ASCII ([A-Za-z])
[[:^alpha:]] Kelas karakter ASCII yang dinegasikan ([^A-Za-z])
[x[^xyz]] Kelas karakter berlapis/pengelompokan (cocok dengan karakter apa pun kecuali y dan z)
[a-y&&xyz] Persimpangan (cocok dengan x atau y)
[0-9&&[^4]] Pengurangan menggunakan persimpangan dan negasi (pencocokan 0-9 kecuali 4)
[0-9--4] Pengurangan langsung (pencocokan 0-9 kecuali 4)
[a-g~~b-h] Perbedaan simetris (pencocokan a dan h hanya)
[\[\]] Escape dalam kelas karakter (cocok [ atau ])
[a&&b] Kelas karakter kosong tidak cocok dengan apa pun

Catatan

Setiap kelas karakter bernama dapat muncul di dalam kelas karakter yang dikurung [...] . Misalnya, [\p{Greek}[:digit:]] cocok dengan digit ASCII atau titik kode apa pun dalam Greek skrip. [\p{Greek}&&\pL] cocok dengan huruf Yunani.

Prioritas dalam kelas karakter adalah dari sebagian besar pengikatan ke pengikatan paling sedikit:

  1. Rentang: [a-cd] == [[a-c]d]
  2. Uni: [ab&&bc] == [[ab]&&[bc]]
  3. Persimpangan, perbedaan, perbedaan konten: Semua memiliki prioritas yang setara, dan dievaluasi dari kiri-ke-kanan. Contohnya,[\pL--\p{Greek}&&\p{Uppercase}] == [[\pL--\p{Greek}]&&\p{Uppercase}].
  4. Negasi: [^a-z&&b] == [^[a-z&&b]].

Komposit

Pola Deskripsi
xy Perangkaian (x diikuti oleh y)
x\|y Alternation (x atau y , prefer x)

Repetisi

Pola Deskripsi
x* Nol atau lebih dari x (serakah)
x+ Satu atau beberapa x (serakah)
x? Nol atau salah satu dari x (serakah)
x*? Nol atau lebih dari x (tidak enak/malas)
x+? Satu atau beberapa x (tidak enak/malas)
x?? Nol atau salah satu dari x (tidak enak/malas)
x{n,m} Setidaknya n x dan paling banyak m x (serakah)
x{n,} Setidaknya n x (serakah)
x{n} Tepat n x
x{n,m}? Setidaknya n x dan paling banyak m x (tidak enak/malas)
x{n,}? Setidaknya n x (tidak enak/malas)
x{n}? Tepat n x

Kecocokan kosong

Pola Deskripsi
^ Awal tumpukan jerami (atau awal baris dengan mode multibaris)
$ Akhir tumpukan jerami (atau akhir baris dengan mode multibaris)
\A Hanya awal tumpukan jerami (bahkan dengan mode multibaris yang diaktifkan)
\z Hanya akhir tumpukan jerami (bahkan dengan mode multibaris yang diaktifkan)
\b Batas kata Unicode (\w di satu sisi dan \W, \A, atau \z di sisi lain)
\B Bukan batas kata Unicode
\b{start}, \< Batas awal kata Unicode (\W\|\A di sebelah kiri, \w di sebelah kanan)
\b{end}, \> Batas akhir kata Unicode (\w di sebelah kiri, \W\|\z di sebelah kanan)
\b{start-half} Setengah dari batas awal kata Unicode (\W\|\A di sebelah kiri)
\b{end-half} Setengah dari batas akhir kata Unicode (\W\|\z di sebelah kanan)

Pengelompokan dan bendera

Pola Deskripsi
(exp) Grup pengambilan bernomor (diindeks dengan membuka tanda kurung)
(?P<name>exp) Grup pengambilan bernama (juga bernomor) (nama harus alfa-numerik)
(?<name>exp) Grup pengambilan bernama (juga bernomor) (nama harus alfa-numerik)
(?:exp) Grup yang tidak menangkap
(?flags) Mengatur bendera dalam grup saat ini
(?flags:exp) Mengatur bendera untuk exp (tidak menangkap)

Nama grup pengambilan hanya dapat berisi titik kode Unicode alfa-numerik, titik ., garis bawah _, dan kurung[ siku dan ]. Nama harus dimulai dengan _ titik kode alfabet atau . Titik kode alfabet sesuai dengan Alphabetic properti Unicode, sementara titik kode numerik sesuai dengan penyatuan Decimal_Numberkategori , Letter_Number dan Other_Number umum.

Bendera adalah karakter tunggal. Misalnya, (?x) mengatur bendera x dan (?-x) menghapus bendera x. Beberapa bendera dapat diatur atau dibersihkan x secara bersamaan: (?xy) mengatur bendera dan y dan (?x-y) mengatur x bendera dan menghapus y bendera. Secara default, semua bendera dinonaktifkan kecuali dinyatakan sebaliknya. Yaitu:

Bendera Deskripsi
i Tidak peka huruf besar/kecil: huruf cocok dengan huruf besar dan kecil
m Mode multibaris: ^ dan $ cocok dengan awal/akhir garis
s Izinkan titik (.). untuk mencocokkan \n
R Mengaktifkan mode CRLF: ketika mode multibaris diaktifkan, \r\n digunakan
U Menukar arti x* dan x*?
u Dukungan Unicode (diaktifkan secara default)
x Mode verbose, mengabaikan spasi kosong dan mengizinkan komentar baris (dimulai dengan #)

Perhatikan bahwa dalam mode verbose, spasi kosong diabaikan di mana-mana, termasuk dalam kelas karakter. Untuk menyisipkan spasi kosong, gunakan formulir escape atau hex literal. Misalnya, \ atau \x20 untuk ruang ASCII.

Catatan

  • Bendera dapat diubah dalam pola. Misalnya, sintaks berikut menggunakan kecocokan yang tidak peka huruf besar/kecil untuk bagian pertama dan kecocokan peka huruf besar/kecil untuk bagian kedua: (?i)a+(?-i)b+.
  • a+ cocok baik a atau A, tetapi satu-satunya b+ cocok b.
  • Mode multibaris berarti ^ dan $ tidak lagi cocok hanya di awal atau akhir input, tetapi juga di awal atau akhir baris. Perhatikan bahwa ^ cocok setelah baris baru, bahkan di akhir input.
  • Ketika mode CRLF dan mode multibaris diaktifkan, maka ^ dan $ cocokkan baik \r dan \n, tetapi tidak pernah di tengah - tengah \r\n.
  • Mode Unicode juga dapat dinonaktifkan secara selektif, meskipun hanya ketika hasilnya tidak akan cocok dengan UTF-8 yang tidak valid. Misalnya, menggunakan batas kata ASCII alih-alih batas kata Unicode mungkin membuat beberapa pencarian regex berjalan lebih cepat: (?-u:\b).+(?-u:\b) untuk mencocokkan $$abc$$.

Urutan escape

Pola Deskripsi
\* Literal *, berlaku untuk semua ASCII kecuali [0-9A-Za-z<>]
\a Bel (\x07)
\f Umpan formulir (\x0C)
\t Tab horizontal
\n Baris baru
\r Carriage return
\v Tab vertikal (\x0B)
\A Cocok di awal tumpukan jerami
\z Cocok di akhir tumpukan jerami
\b Pernyataan batas kata
\B Pernyataan batas kata yang dinegasikan
\b{start}, \< Pernyataan batas awal kata
\b{end}, \> Pernyataan batas akhir kata
\b{start-half} Setengah dari pernyataan batas awal kata
\b{end-half} Setengah dari pernyataan batas akhir kata
\123 Kode karakter oktal, hingga tiga digit
\x7F Kode karakter heks (tepat dua digit)
\x{10FFFF} Kode karakter hex yang sesuai dengan titik kode Unicode
\u007F Kode karakter heks (tepat empat digit)
\u{7F} Kode karakter hex yang sesuai dengan titik kode Unicode
\U0000007F Kode karakter heks (tepat delapan digit)
\U{7F} Kode karakter hex yang sesuai dengan titik kode Unicode
\p{Letter} kelas karakter Unicode
\P{Letter} Kelas karakter Unicode yang dinegasikan
\d, , \s\w Kelas karakter Perl
\D, , \S\W Kelas karakter Perl yang dinegasikan

Kelas karakter Perl (ramah Unicode)

Kelas-kelas ini didasarkan pada definisi yang disediakan dalam UTS#18:

Pola Deskripsi
\d Ddigit (\p{Nd})
\D Bukan digit
\s Spasi kosong (\p{White_Space})
\S Bukan spasi kosong
\w Karakter kata (\p{Alphabetic}\p{Join_Control} + + + \p{Pc} + \p{M}\d)
\W Bukan karakter kata

Kelas karakter ASCII

Kelas-kelas ini didasarkan pada definisi yang disediakan dalam UTS#18:

Pola Deskripsi
[[:alnum:]] Alfanumerik ([0-9A-Za-z])
[[:alpha:]] Alfabet ([A-Za-z])
[[:ascii:]] ASCII ([\x00-\x7F])
[[:blank:]] Kosong ([\t ])
[[:cntrl:]] Kontrol ([\x00-\x1F\x7F])
[[:digit:]] Digit ([0-9])
[[:graph:]] Grafis ([!-~])
[[:lower:]] Huruf kecil ([a-z])
[[:print:]] Dapat dicetak ([ -~])
[[:punct:]] Tanda baca ([!-/:-@\[-`{-~])
[[:space:]] Spasi kosong ([\t\n\v\f\r ])
[[:upper:]] Huruf besar ([A-Z])
[[:word:]] Karakter kata ([0-9A-Za-z_])
[[:xdigit:]] Digit heks ([0-9A-Fa-f])

Performa

Bagian ini menyediakan beberapa panduan tentang kecepatan dan penggunaan sumber daya ekspresi regex.

Unicode dapat memengaruhi penggunaan memori dan kecepatan pencarian

Regex KQL menyediakan dukungan kelas satu untuk Unicode. Dalam banyak kasus, memori tambahan yang diperlukan untuk mendukung Unicode dapat diabaikan dan biasanya tidak akan memengaruhi kecepatan pencarian.

Berikut ini adalah beberapa contoh kelas karakter Unicode yang dapat memengaruhi penggunaan memori dan kecepatan pencarian:

  • Penggunaan memori: Dampak Unicode terutama muncul dari penggunaan kelas karakter Unicode. Kelas karakter Unicode cenderung berukuran lebih besar. Misalnya, \w kelas karakter cocok dengan sekitar 140.000 titik kode yang berbeda secara default. Ini membutuhkan memori tambahan dan dapat memperlambat kompilasi regex. Jika kebutuhan Anda dapat dipenuhi oleh ASCII, disarankan untuk menggunakan kelas ASCII alih-alih kelas Unicode. Versi khusus ASCII \w dapat diekspresikan dalam beberapa cara, yang semuanya setara.

    [0-9A-Za-z_]
    (?-u:\w)
    [[:word:]]
    [\w&&\p{ascii}]
    
  • Kecepatan pencarian: Unicode cenderung ditangani dengan cukup baik, bahkan ketika menggunakan kelas karakter Unicode besar. Namun, beberapa mesin regex internal yang lebih cepat tidak dapat menangani pernyataan batas kata sadar Unicode. Jadi jika Anda tidak memerlukan pernyataan batas kata sadar Unicode, Anda mungkin mempertimbangkan untuk menggunakan (?-u:\b) alih-alih \b. (?-u:\b) menggunakan definisi khusus ASCII dari karakter kata, yang dapat meningkatkan kecepatan pencarian.

Literal dapat mempercepat pencarian

Regex KQL memiliki kemampuan yang kuat untuk mengenali literal dalam pola regex, yang dapat mempercepat pencarian secara signifikan. Jika memungkinkan, termasuk literal dalam pola Anda dapat sangat meningkatkan performa pencarian. Misalnya, dalam regex \w+@\w+, kemunculan @ pertama dicocokkan dan kemudian kecocokan terbalik dilakukan untuk \w+ menemukan posisi awal.