ungkapan biasa
Apakah sebenarnya ungkapan biasa?
Watak ialah unit paling asas apabila perisian komputer memproses teks, yang mungkin huruf, nombor, tanda baca, ruang, baris baharu, aksara Cina, dsb. Rentetan ialah urutan 0 atau lebih aksara. Teks ialah teks, rentetan. Untuk mengatakan bahawa rentetan tertentu sepadan dengan ungkapan biasa tertentu biasanya bermakna bahagian (atau beberapa bahagian) rentetan itu boleh memenuhi syarat yang diberikan oleh ungkapan itu.
Apabila menulis program atau halaman web yang memproses rentetan, selalunya terdapat keperluan untuk mencari rentetan yang sepadan dengan peraturan kompleks tertentu. Ungkapan biasa ialah alat yang digunakan untuk menerangkan peraturan ini. Dengan kata lain, ungkapan biasa ialah kod yang merekodkan peraturan teks.
Kemungkinan besar anda telah menggunakan kad bebas untuk carian fail di bawah Windows/Dos, iaitu * dan ?. Jika anda ingin mencari semua dokumen Word dalam direktori tertentu, anda akan mencari *.doc. Di sini, * akan ditafsirkan sebagai rentetan arbitrari. Sama seperti kad bebas, ungkapan biasa juga merupakan alat yang digunakan untuk pemadanan teks, tetapi ia boleh menerangkan keperluan anda dengan lebih tepat berbanding kad bebas - sudah tentu, dengan kos yang lebih rumit - contohnya, anda boleh menulis ungkapan biasa, Digunakan untuk mencari semua rentetan bermula dengan 0, diikuti dengan 2-3 digit, kemudian tanda sempang "-", dan akhirnya 7 atau 8 digit (seperti 010-12345678 atau 0376-7654321).
Bermula
Cara terbaik untuk mempelajari ungkapan biasa ialah bermula dengan contoh, dan kemudian mengubah suai dan bereksperimen dengan contoh selepas anda memahami mereka. Beberapa contoh mudah diberikan di bawah, dan ia diterangkan secara terperinci.
Andaikata anda sedang mencari hi dalam novel Inggeris, anda boleh menggunakan ungkapan biasa hi.
Ini adalah ungkapan biasa yang paling mudah Ia boleh memadankan rentetan seperti ini dengan tepat: ia terdiri daripada dua aksara, aksara pertama ialah h dan aksara terakhir ialah i. Biasanya, alat yang memproses ungkapan biasa akan memberikan pilihan untuk mengabaikan huruf besar Jika pilihan ini dipilih, ia boleh memadankan mana-mana empat kes hi, HI, Hi dan hI.
Malangnya, banyak perkataan mengandungi dua aksara berturut-turut hi, seperti dia, sejarah, tinggi, dll. Jika anda menggunakan hi untuk mencari, hi dalam juga akan ditemui. Sekiranya kita ingin mencari perkataan hi dengan tepat, kita harus menggunakan bhib.
b ialah kod khas yang ditentukan oleh ungkapan biasa (setengah orang memanggilnya metacharacter), yang mewakili permulaan atau akhir perkataan, yang merupakan sempadan perkataan. Walaupun perkataan Inggeris biasanya dipisahkan oleh ruang, tanda baca atau baris baharu, b tidak sepadan dengan mana-mana aksara pemisah perkataan ini, ia hanya sepadan dengan satu kedudukan.
Jika anda perlu lebih tepat, b sepadan dengan kedudukan di mana watak sebelum dan selepas ia bukan kedua-duanya (satu ada, satu tidak atau tidak wujud) w.
Jika apa yang anda cari adalah hai diikuti oleh Lucy yang tidak jauh, anda harus menggunakan bhib.*bLucyb.
Di sini, . ialah satu lagi aksara meta, sepadan dengan mana-mana aksara kecuali aksara baris baharu. * juga merupakan metacharacter, tetapi ia bukan mewakili watak, mahupun kedudukan, tetapi kuantiti - ia menyatakan bahawa kandungan sebelum * boleh digunakan berulang kali dalam beberapa kali untuk menjadikan keseluruhan ungkapan sepadan. Oleh itu, .* bersama bermaksud sebarang bilangan aksara yang tidak termasuk baris baharu. Kini makna bhib.*bLucyb jelas: pertama perkataan hi, kemudian sebarang bilangan aksara (tetapi bukan baris baharu), dan akhirnya perkataan Lucy.
Watak baris baharu ialah 'n', kod ASCII ialah 10 aksara (heksadesimal 0x0A).
Jika metakarakter lain digunakan bersama, kami boleh membina ungkapan biasa yang lebih berkuasa. Contohnya, contoh berikut:
0dd-dddddddd sepadan dengan rentetan yang bermula dengan 0, kemudian dua digit, kemudian tanda sempang "-", dan akhirnya 8 digit (iaitu, nombor telefon Cina Nombor. Sudah tentu , contoh ini hanya boleh memadankan situasi di mana kod kawasan ialah 3 digit).
D di sini ialah metakarakter baharu, sepadan dengan satu digit (0, atau 1, atau 2, atau...). - bukan metacharacter, ia hanya sepadan dengan dirinya sendiri - tanda sempang (atau tanda tolak, atau sempang, atau apa sahaja yang anda mahu panggil).
Untuk mengelakkan begitu banyak pengulangan yang menjengkelkan, kami juga boleh menulis ungkapan ini seperti ini: 0d{2}-d{8}. Di sini {2} ({8}) selepas d bermakna bahawa d sebelumnya mesti diulang dan dipadankan 2 kali (8 kali).
Menguji ungkapan biasa
Alat ujian lain yang tersedia:
RegexBuddy
Alat Ujian Dalam Talian Ungkapan Biasa Javascript
Jika anda tidak mendapati ungkapan biasa sukar dibaca dan ditulis, sama ada anda seorang genius atau anda bukan dari Bumi. Sintaks ungkapan biasa boleh mengelirukan, walaupun untuk orang yang kerap menggunakannya. Kerana sukar untuk membaca dan menulis dan terdedah kepada ralat, adalah perlu untuk mencari alat untuk menguji ungkapan biasa.
Sesetengah butiran ungkapan biasa adalah berbeza dalam persekitaran yang berbeza Tutorial ini memperkenalkan gelagat ungkapan biasa di bawah Microsoft .Net Framework 2.0, jadi saya akan memperkenalkan anda kepada alat di bawah .Net Regex Tester. Mula-mula pastikan anda telah memasang .Net Framework 2.0, kemudian muat turun Penguji Regex. Ini adalah perisian hijau Selepas memuat turun, buka pakej termampat dan jalankan RegexTester.exe secara langsung.
Berikut ialah tangkapan skrin Penguji Regex yang sedang berjalan:
Metacharacters
Kini anda sudah mengetahui beberapa aksara meta yang berguna, seperti b,.,*, dan d Terdapat lebih banyak aksara meta dalam ungkapan biasa, seperti s memadankan mana-mana aksara ruang putih, termasuk ruang, Tab, baris baharu, lebar penuh bahasa Cina. ruang, dsb. w memadankan huruf atau nombor atau garis bawah atau aksara Cina, dsb.
Pemprosesan khas aksara Cina/Cina disokong oleh enjin ungkapan biasa yang disediakan oleh .Net Untuk butiran dalam persekitaran lain, sila semak dokumen yang berkaitan.
Berikut ialah beberapa contoh lagi:
baw*b memadankan perkataan bermula dengan huruf a - mula-mula permulaan perkataan (b), kemudian huruf a, kemudian Sebarang bilangan huruf atau nombor (w*), diikuti dengan akhir perkataan (b).
Baiklah, sekarang mari kita bincangkan tentang maksud perkataan dalam ungkapan biasa: tidak kurang daripada satu w berturut-turut. Ya, ini tidak banyak kaitan dengan beribu-ribu perkara dengan nama yang sama yang perlu anda hafal semasa belajar bahasa Inggeris :)
d+ sepadan dengan 1 atau lebih nombor berturut-turut. + di sini ialah metacharacter yang serupa dengan *, perbezaannya ialah * padanan diulang beberapa kali (mungkin 0 kali), manakala + padanan diulang 1 kali atau lebih.
bw{6}b sepadan dengan perkataan dengan tepat 6 aksara.
Jadual 1. Metakarakter yang biasa digunakan
Enjin ungkapan biasa biasanya menyediakan Kaedah "ujian sama ada rentetan yang ditentukan sepadan dengan ungkapan biasa", seperti RegExp Kaedah .test() dalam JavaScript atau kaedah Regex.IsMatch() dalam .NET. Padanan di sini merujuk kepada sama ada terdapat mana-mana bahagian rentetan yang mematuhi peraturan ungkapan. Jika ^ dan $ tidak digunakan, untuk d{5,12}, menggunakan kaedah ini hanya boleh memastikan bahawa rentetan mengandungi 5 hingga 12 digit berturut-turut, dan bukannya keseluruhan rentetan 5 hingga 12 digit.
Karakter meta ^ (simbol pada kekunci yang sama dengan nombor 6) dan $ kedua-duanya sepadan dengan kedudukan, yang agak serupa dengan b. ^ sepadan dengan permulaan rentetan yang anda cari dan $ sepadan dengan penghujungnya. Kedua-dua kod ini sangat berguna semasa mengesahkan kandungan input Contohnya, jika tapak web memerlukan nombor QQ yang anda isi mestilah 5 hingga 12 digit, anda boleh menggunakan: ^d{5,12}$.
{5,12} di sini adalah serupa dengan {2} yang diperkenalkan sebelum ini, kecuali padanan {2} hanya boleh diulang dua kali, tidak lebih, tidak kurang dan {5,12} diulang Nombor tidak boleh kurang daripada 5 kali dan tidak boleh lebih daripada 12 kali, jika tidak, ia tidak akan sepadan.
Oleh kerana ^ dan $ digunakan, keseluruhan rentetan input mesti digunakan untuk memadankan d{5,12}, yang bermaksud bahawa keseluruhan input mestilah 5 hingga 12 nombor, jadi jika input Jika nombor QQ boleh memadankan ungkapan biasa ini, ia memenuhi keperluan.
Sama seperti pilihan untuk mengabaikan kes, beberapa alatan pemprosesan ungkapan biasa juga mempunyai pilihan untuk memproses berbilang baris. Jika pilihan ini dipilih, makna ^ dan $ menjadi permulaan dan penghujung baris yang dipadankan.
Larian watak
Jika anda ingin mencari aksara meta itu sendiri, seperti ., atau *, terdapat masalah: anda tidak boleh menentukannya, kerana ia akan ditafsirkan sebagai sesuatu yang lain. Pada masa ini anda perlu menggunakan untuk membatalkan makna istimewa aksara ini. Oleh itu, anda harus menggunakan . Sudah tentu, untuk mencari sendiri, anda juga perlu menggunakan \.
Contohnya: deerchao.net sepadan dengan deerchao.net, C:\Windows sepadan dengan C:Windows.
Ulang
Anda telah pun melihat ulangan padanan cara *, +, {2}, {5,12} sebelumnya. Berikut ialah semua penentu dalam ungkapan biasa (bilangan kod yang ditentukan, seperti *, {5,12}, dsb.):
Jadual 2. Penentu yang biasa digunakan
Berikut ialah beberapa contoh penggunaan pengulangan:
Windowsd+ sepadan dengan Windows diikuti dengan 1 atau lebih digit
^w+ sepadan dengan perkataan pertama baris (atau keseluruhan rentetan Yang pertama perkataan , makna padanan khusus bergantung pada tetapan pilihan)
Kelas aksara
Untuk mencari nombor, huruf atau nombor, Whitespace sangat mudah, kerana sudah ada aksara meta yang sepadan dengan set aksara ini, tetapi bagaimana jika anda ingin memadankan set aksara yang tidak mempunyai aksara meta yang dipratentukan (seperti vokal a, e, i, o, u)?
Ia sangat mudah, anda hanya perlu menyenaraikannya dalam kurungan segi empat sama, seperti [aeiou] sepadan dengan mana-mana vokal bahasa Inggeris, [.?!] sepadan dengan tanda baca (. or? or!) .
Kami juga boleh dengan mudah menentukan julat aksara Contohnya, [0-9] mewakili maksud yang sama seperti d: satu digit sama, [a-z0-9A-Z_] juga sama sepenuhnya . dalam w (jika hanya bahasa Inggeris dipertimbangkan).
Berikut ialah ungkapan yang lebih kompleks: (?0d{2}[) -]?d{8}.
"(" dan ")" juga merupakan metakarakter, yang akan disebut dalam bahagian kumpulan nanti, jadi mereka perlu melarikan diri di sini.
Ungkapan ini boleh memadankan nombor telefon dalam beberapa format, seperti (010)88886666, atau 022-22334455, atau 02912345678, dsb. Mari kita lakukan beberapa analisis mengenainya: mula-mula terdapat watak melarikan diri (, ia boleh muncul 0 atau 1 kali (?), kemudian 0, diikuti dengan 2 digit (d{2}), kemudian) atau - Atau salah satu ruang , yang muncul 1 kali atau tidak (?), dan akhirnya 8 digit (d{8}).
Keadaan cawangan
Malangnya, ungkapan tadi juga boleh memadankan "Tidak" seperti 010)12345678 atau (022-87654321 "Betul" Untuk menyelesaikan masalah ini, kita perlu menggunakan syarat cawangan dalam ungkapan biasa peraturan yang berbeza. Tidak faham? nombor yang dipisahkan dengan sempang: satu ialah kod kawasan tiga digit dan nombor tempatan lapan digit (seperti 010-12345678), dan satu ialah kod kawasan empat digit dan nombor tempatan tujuh digit (0376-2233445).
(0h{2})[- ]?d{8}|0h{2}[- ]?d{8} Ungkapan ini sepadan dengan nombor telefon dengan kod kawasan 3 digit, di mana kod kawasan boleh disertakan dalam kurungan, Ia tidak perlu digunakan Kod kawasan dan kod tempatan boleh dipisahkan dengan tanda sempang atau ruang, atau tidak boleh ada pemisahan. Anda boleh cuba menggunakan syarat cawangan untuk melanjutkan ungkapan ini untuk turut menyokong kod kawasan 4 digit.
d{5}-d{4}|d{5} Ungkapan ini digunakan untuk memadankan kod pos di Amerika Syarikat. Peraturan untuk kod pos AS ialah 5 digit atau 9 digit dipisahkan oleh tanda sempang. Sebab mengapa contoh ini diberikan adalah kerana ia boleh menggambarkan masalah: apabila menggunakan keadaan cawangan, perhatikan susunan setiap syarat. Jika anda menukarnya kepada d{5}|d{5}-d{4}, maka hanya kod pos 5 digit (dan 5 digit pertama kod pos 9 digit) akan dipadankan. Sebabnya, apabila memadankan syarat cawangan, setiap syarat akan diuji dari kiri ke kanan Jika cawangan tertentu dipenuhi, syarat lain tidak akan dipertimbangkan.
Mengumpulkan
Kami telah menyebut cara mengulang satu aksara (hanya tambahkan kelayakan terus selepas watak itu); Apa yang perlu dilakukan jika berbilang aksara diulang? Anda boleh menggunakan kurungan untuk menentukan subungkapan (juga dipanggil kumpulan), dan kemudian anda boleh menentukan bilangan ulangan subungkapan ini Anda juga boleh melakukan operasi lain pada subungkapan (akan diperkenalkan kemudian).
(d{1,3}.){3}d{1,3} ialah ungkapan padanan alamat IP yang mudah. Untuk memahami ungkapan ini, analisanya dalam susunan berikut: d{1,3} sepadan dengan nombor daripada 1 hingga 3 digit, (d{1,3}.){3} sepadan dengan nombor tiga digit campur noktah (ini Keseluruhannya ialah kumpulan ini) diulang tiga kali, dan akhirnya nombor satu hingga tiga digit (d{1,3}) ditambah.
Tiada nombor dalam alamat IP boleh melebihi 255. Jangan biarkan penulis Musim 3 "24" memperdayakan anda...
Malangnya, ia juga akan sepadan dengan 256.300 An Alamat IP seperti .888.999 yang tidak boleh wujud. Jika anda boleh menggunakan perbandingan aritmetik, anda mungkin boleh menyelesaikan masalah ini dengan mudah, tetapi ungkapan biasa tidak menyediakan sebarang fungsi matematik, jadi anda hanya boleh menggunakan kelas kumpulan, pemilihan dan aksara yang panjang untuk menerangkan alamat IP yang betul :( (2 [0-4]d|25[0-5]|[01]?dd?).){3}(2[0-4]d|25[0-5]|[01]?dd? ).
Kunci untuk memahami ungkapan ini ialah memahami 2[0-4]d|25[0-5]|[01]?dd?, saya tidak akan menerangkan butiran di sini, anda sepatutnya dapat untuk menganalisisnya sendiri Keluar dengan maksudnya.
Antonim
Kadangkala perlu mencari aksara yang tidak tergolong dalam kelas watak yang mudah ditentukan. Contohnya, jika anda ingin mencari sebarang aksara selain nombor, anda perlu menggunakan antonim:
Jadual 3. Kod antonim yang biasa digunakan
Rujukan belakang
Selepas menggunakan kurungan untuk menentukan subungkapan, teks yang sepadan dengan subungkapan ini (iaitu kandungan yang ditangkap oleh kumpulan ini) boleh diproses selanjutnya dalam ungkapan atau program lain. Secara lalai, setiap kumpulan secara automatik akan mempunyai nombor kumpulan Peraturannya ialah: dari kiri ke kanan, dengan kurungan kiri kumpulan sebagai tanda, nombor kumpulan kumpulan pertama yang muncul ialah 1, yang kedua ialah 2, dan begitulah seterusnya.
Eh... Sebenarnya, peruntukan nombor kumpulan tidak semudah yang saya katakan:
Kumpulan 0 sepadan dengan keseluruhan ungkapan biasa
Malah, nombor kumpulan proses peruntukan ialah Ia perlu diimbas dua kali dari kiri ke kanan: pas pertama hanya diberikan kepada kumpulan yang tidak dinamakan, pas kedua hanya diberikan kepada kumpulan yang dinamakan - oleh itu nombor kumpulan semua kumpulan yang dinamakan lebih besar daripada nombor kumpulan yang tidak dinamakan
Anda boleh menggunakan sintaks seperti (?:exp) untuk melucutkan hak kumpulan untuk mengambil bahagian dalam peruntukan nombor kumpulan.
Rujukan ke belakang digunakan untuk mencari berulang kali untuk teks yang sepadan dengan kumpulan sebelumnya. Sebagai contoh, 1 mewakili teks yang dipadankan oleh kumpulan 1. Sukar untuk difahami? Sila lihat contoh:
b(w+)bs+1b boleh digunakan untuk memadankan perkataan berulang, seperti go go atau kitty kitty. Ungkapan ini pertama sekali ialah perkataan, iaitu, lebih daripada satu huruf atau nombor (b(w+)b) antara permulaan dan akhir perkataan Perkataan ini akan ditangkap dalam kumpulan bernombor 1, dan kemudian 1 Satu atau lebih ruang kosong aksara (s+), dan akhirnya kandungan yang ditangkap dalam kumpulan 1 (iaitu, perkataan yang dipadankan sebelum ini) (1).
Anda juga boleh menentukan sendiri nama kumpulan subungkapan itu. Untuk menentukan nama kumpulan subungkapan, gunakan sintaks berikut: (?<Word>w+) (atau gantikan kurungan sudut dengan ': (?'Word'w+)), supaya nama kumpulan w+ Namanya ialah ditetapkan sebagai Word. Untuk merujuk semula kandungan yang ditangkap oleh kumpulan ini, anda boleh menggunakan k<Word>, jadi contoh sebelumnya juga boleh ditulis seperti ini: b(?<Word>w+)bs+k<Word>b.
Apabila menggunakan kurungan, terdapat banyak sintaks tujuan khas. Beberapa yang paling biasa digunakan disenaraikan di bawah:
Jadual 4. Sintaks kumpulan biasa
Penegasan lebar sifar
Orang di bumi, adakah anda rasa istilah dan nama ini terlalu rumit dan sukar untuk diingat? Saya juga merasakan perkara yang sama. Maklum sajalah ada yang begitu, apa namanya, biarkan saja! Jika orang itu tidak mempunyai nama, dia boleh menumpukan pada latihan pedang jika objek itu tidak mempunyai nama, dia boleh memilih sesuka hati...
Empat berikutnya digunakan untuk mencari sebelum atau selepas kandungan tertentu (tetapi tidak. termasuk kandungan ini) Perkara, iaitu, ia digunakan seperti b,^,$ untuk menentukan kedudukan yang harus memenuhi syarat tertentu (iaitu penegasan), jadi ia juga dipanggil penegasan lebar sifar. Sebaik-baiknya gunakan contoh untuk menggambarkan:
Penegasan digunakan untuk mengisytiharkan fakta yang sepatutnya benar. Pemadanan ungkapan biasa hanya akan diteruskan apabila pernyataan itu benar.
(?=exp) juga dipanggil penegasan pandangan hadapan positif lebar sifar Ia menegaskan bahawa ungkapan exp boleh dipadankan selepas kedudukan di mana ia muncul. Contohnya, bw+(?=ingb) sepadan dengan bahagian hadapan perkataan yang berakhir dengan ing (selain ing). Contohnya, apabila mencari Saya menyanyi semasa anda menari.
(?<=exp) juga dipanggil penegasan post-lookback positif lebar sifar Ia menegaskan bahawa kedudukan sebelum itu sendiri boleh sepadan dengan ungkapan exp. Contohnya, (?<=bre)w+b akan memadankan separuh kedua perkataan yang bermula dengan re (selain daripada re) Contohnya, apabila mencari untuk membaca buku, ia sepadan dengan ading.
Jika anda ingin menambah koma di antara setiap tiga digit dalam nombor yang sangat panjang (sudah tentu ditambah dari kanan), anda boleh mencari bahagian yang perlu didahului dan ditambah dengan koma seperti ini: ((( ?<=d)d{3})+b, apabila digunakan untuk mencari 1234567890, hasilnya ialah 234567890.
Contoh berikut menggunakan kedua-dua penegasan: (?<=s)d+(?=s) sepadan dengan nombor yang dipisahkan oleh aksara ruang putih (sekali lagi, aksara ruang putih ini tidak disertakan).
Penegasan lebar sifar negatif
Kami telah menyebut sebelum ini cara mencari aksara yang bukan watak tertentu atau tidak berada dalam kelas aksara tertentu kaedah (antonim). Tetapi bagaimana jika kita hanya mahu memastikan watak tertentu tidak muncul, tetapi tidak mahu memadankannya? Sebagai contoh, jika kita ingin mencari perkataan di mana huruf q muncul, tetapi q tidak diikuti oleh huruf u, kita boleh mencuba ini:
bw*q[^u]w*b sepadan dengan mengandungi Perkataan yang diikuti oleh huruf q yang bukan huruf u. Tetapi jika anda melakukan lebih banyak ujian (atau jika pemikiran anda cukup tajam, anda boleh memerhatikannya secara langsung), anda akan mendapati bahawa jika q muncul pada akhir perkataan, seperti Iraq, Benq, ungkapan ini akan menjadi salah. Ini kerana [^u] sentiasa sepadan dengan satu aksara, jadi jika q ialah aksara terakhir perkataan, [^u] berikut akan sepadan dengan perkataan pemisah selepas q (yang mungkin ruang, noktah atau Apa yang lain), w*b berikut akan sepadan dengan perkataan seterusnya, jadi bw*q[^u]w*b boleh menyamai keseluruhan pertempuran Iraq. Penegasan lebar sifar negatif boleh menyelesaikan masalah ini kerana ia hanya sepadan dengan satu kedudukan dan tidak menggunakan sebarang aksara. Sekarang, kita boleh menyelesaikan masalah ini seperti ini: bw*q(?!u)w*b.
Pernyataan pandangan negatif lebar sifar (?!exp), menegaskan bahawa ungkapan exp tidak boleh dipadankan selepas kedudukan ini. Contohnya: d{3}(?!d) sepadan dengan tiga digit, dan tiga digit ini tidak boleh diikuti dengan nombor; b((?!abc)w)+b sepadan dengan perkataan yang tidak mengandungi rentetan berterusan abc.
Begitu juga, kita boleh menggunakan (?<!exp), pernyataan lihat balik negatif lebar sifar untuk menegaskan bahawa kedudukan sebelumnya tidak boleh sepadan dengan ungkapan exp: (?<![a-z])d{ 7 } sepadan dengan nombor tujuh digit yang tidak didahului oleh huruf kecil.
Sila analisis ungkapan (?<=<(w+)>).*(?=</1>) secara terperinci.
Contoh yang lebih kompleks: (?<=<(w+)>).*(?=</1>) sepadan dengan kandungan dalam teg HTML ringkas yang tidak mengandungi atribut. (<?(w+)>) menentukan awalan: perkataan yang disertakan dalam kurungan sudut (contohnya, ia mungkin <b>), kemudian .* (rentetan arbitrari), dan akhirnya akhiran (? =< ;/1>). Beri perhatian kepada / dalam akhiran, yang menggunakan pelarian aksara yang disebutkan tadi 1 adalah rujukan belakang, yang merujuk kepada kumpulan pertama yang ditangkap, kandungannya dipadankan dengan sebelumnya (w+), jadi jika awalan sebenarnya Jika <b>, akhiran ialah </b>. Seluruh ungkapan sepadan dengan kandungan antara <b> dan </b> (sekali lagi, tidak termasuk awalan dan akhiran itu sendiri).
Ulasan
Satu lagi kegunaan kurungan ialah memasukkan ulasan melalui sintaks (?#comment). Contohnya: 2[0-4]d(?#200-249)|25[0-5](?#250-255)|[01]?dd?(?#0-199).
Jika anda ingin memasukkan ulasan, sebaiknya dayakan pilihan "Abaikan aksara ruang putih dalam corak", supaya anda boleh menambah ruang, tab dan baris baharu sewenang-wenangnya semasa menulis ungkapan, tetapi ini akan diabaikan dalam kegunaan sebenar. Apabila pilihan ini didayakan, semua teks yang mengikuti # hingga penghujung baris akan diabaikan sebagai ulasan. Sebagai contoh, kita boleh menulis ungkapan sebelumnya seperti ini:
(?<= # 断言要匹配的文本的前缀 <(\w+)> # 查找尖括号括起来的字母或数字(即HTML/XML标签) ) # 前缀结束 .* # 匹配任意文本 (?= # 断言要匹配的文本的后缀 <\/> # 查找尖括号括起来的内容:前面是一个"/",后面是先前捕获的标签 ) # 后缀结束
Ketamakan dan kemalasan
Apabila ungkapan biasa mengandungi berulang Apabila menentukan kelayakan , tingkah laku biasa adalah untuk memadankan seberapa banyak aksara yang mungkin (sementara masih membenarkan keseluruhan ungkapan dipadankan). Ambil ungkapan ini sebagai contoh: a.*b, ia akan sepadan dengan rentetan terpanjang bermula dengan a dan berakhir dengan b. Jika anda menggunakannya untuk mencari aabab, ia akan sepadan dengan keseluruhan rentetan aabab. Ini dinamakan padanan tamak.
Kadangkala, kita memerlukan pemadanan yang malas, iaitu pemadanan sesedikit mungkin aksara. Kelayakan yang diberikan di atas boleh ditukar kepada corak padanan malas dengan menambahkan tanda soal ? Dengan cara ini, .*? bermaksud memadankan sebarang bilangan ulangan, tetapi menggunakan ulangan paling sedikit yang menjadikan keseluruhan perlawanan berjaya. Sekarang lihat versi malas contoh:
a.*?b sepadan dengan rentetan terpendek bermula dengan a dan berakhir dengan b. Jika anda menggunakannya pada aabab, ia akan sepadan dengan aab (aksara pertama hingga ketiga) dan ab (aksara keempat hingga kelima).
Mengapakah padanan pertama aab (aksara pertama hingga ketiga) dan bukannya ab (aksara kedua hingga ketiga)? Ringkasnya, kerana ungkapan biasa mempunyai peraturan lain yang mempunyai keutamaan yang lebih tinggi daripada peraturan malas/tamak: perlawanan yang bermula paling awal mempunyai keutamaan tertinggi—Perlawanan yang bermula paling awal menang.
Jadual 5. Kelayakan Lazy
Pilihan Pemprosesan
Dalam C#, anda boleh menggunakan pembina Regex(String, RegexOptions) untuk menetapkan pilihan pemprosesan ungkapan biasa. Contohnya: Regex regex = new Regex(@"baw{6}b", RegexOptions.IgnoreCase);
Di atas memperkenalkan beberapa pilihan seperti mengabaikan huruf besar kecil, memproses berbilang baris, dsb. Pilihan ini boleh digunakan untuk menukar Cara mengendalikan ungkapan biasa. Berikut ialah pilihan ungkapan biasa yang biasa digunakan dalam .Net:
Jadual 6. Pilihan pemprosesan yang biasa digunakan
Soalan yang sering ditanya ialah: Ya Adakah' Adakah mungkin untuk menggunakan hanya satu mod berbilang talian dan mod satu talian pada masa yang sama? Jawapannya ialah: tidak. Tiada hubungan antara kedua-dua pilihan ini, kecuali nama mereka adalah sama mengelirukan.
Padanan Kumpulan/Rekursif Seimbang
Sintaks kumpulan seimbang yang diperkenalkan di sini disokong oleh .Net Framework mungkin tidak semestinya menyokongnya Fungsi ini mungkin disokong tetapi memerlukan sintaks yang berbeza.
Kadangkala kita perlu memadankan struktur hierarki bersarang seperti (100 * (50 + 15) Dalam kes ini, hanya menggunakan (.+) hanya akan sepadan dengan kurungan paling kiri dan Kandungan antara penutup paling kanan kurungan (di sini kita membincangkan mod tamak, mod malas juga mempunyai masalah berikut). Jika bilangan kemunculan kurungan kiri dan kurungan kanan dalam rentetan asal tidak sama, seperti (5 / (3 + 2))), maka nombor dua dalam hasil padanan kami tidak akan sama. Adakah terdapat sebarang cara untuk memadankan kandungan yang paling panjang dan sepadan antara kurungan dalam rentetan sedemikian?
Untuk mengelakkan ( dan ( benar-benar mengelirukan otak anda, mari kita gunakan kurungan sudut dan bukannya kurungan bulat. Sekarang soalan kita ialah bagaimana untuk menggantikan xx <aa <bbb> <bbb> Dalam rentetan seperti aa> yy, kandungan dalam kurungan sudut berpasangan terpanjang ditangkap?
Struktur sintaks berikut perlu digunakan di sini:
(?'kumpulan') Kandungan yang ditangkap dinamakan kumpulan dan ditolak ke dalam tindanan (Timbunan)
(?'-kumpulan') Menimbulkan kandungan yang ditangkap bernama kumpulan yang terakhir ditolak ke dalam timbunan daripada timbunan Jika timbunan pada asalnya kosong, maka Padanan kumpulan ini gagal
(?(kumpulan)ya|tidak) Jika terdapat kandungan yang ditangkap bernama kumpulan pada tindanan, teruskan padankan ungkapan bahagian ya, jika tidak, teruskan padankan bahagian tidak
(?!) Penegasan pandangan negatif lebar sifar, memandangkan tiada ungkapan akhiran, cubaan memadankan sentiasa gagal
Jika anda bukan pengaturcara (atau anda menggelarkan diri anda seorang pengaturcara tetapi tidak tahu apa itu stack is), anda boleh memahami tiga sintaks di atas seperti ini: yang pertama ialah menulis "kumpulan" di papan hitam, yang kedua ialah memadamkan "kumpulan" dari papan hitam, dan yang ketiga ialah membaca apa yang ditulis pada papan hitam jika tiada "kumpulan", teruskan padankan bahagian ya, jika tidak padankan bahagian tidak.
Apa yang perlu kita lakukan ialah menolak "Buka" setiap kali kita menghadapi kurungan kiri, pop timbul setiap kali kita bertemu kurungan kanan, dan pada penghujungnya, semak sama ada tindanan itu kosong - jika tiada kosong, maka Ia membuktikan bahawa terdapat lebih banyak kurungan kiri daripada kurungan kanan, jadi perlawanan harus gagal. Enjin ungkapan biasa akan mundur (membuang beberapa aksara pertama atau terakhir) dan cuba memadankan keseluruhan ungkapan.
< #最外层的左括号 [^<>]* #最外层的左括号后面的不是括号的内容 ( ( (?'Open'<) #碰到了左括号,在黑板上写一个"Open" [^<>]* #匹配左括号后面的不是括号的内容 )+ ( (?'-Open'>) #碰到了右括号,擦掉一个"Open" [^<>]* #匹配右括号后面不是括号的内容 )+ )* (?(Open)(?!)) #在遇到最外层的右括号前面,判断黑板上还有没有没擦掉的"Open";如果还有,则匹配失败 > #最外层的右括号
Salah satu aplikasi kumpulan seimbang yang paling biasa adalah untuk memadankan HTML Contoh berikut boleh memadankan teg <div> ]*(((?'Buka'<div[^>]*>)[^<>]*)+((?'-Buka'</div>)[^<> ]*)+)*(?(Buka)(?!))</div>.
Ada lagi yang tidak disebut
Sebilangan besar elemen untuk membina ungkapan biasa telah diterangkan di atas, tetapi masih terdapat banyak perkara yang belum disebut. Di bawah ialah senarai beberapa elemen yang tidak disebut, dengan sintaks dan penjelasan mudah. Anda boleh mendapatkan rujukan yang lebih terperinci dalam talian untuk mengetahui tentangnya apabila anda perlu menggunakannya. Jika anda telah memasang Perpustakaan MSDN, anda juga boleh mendapatkan dokumentasi terperinci tentang ungkapan biasa di bawah .net.
Pengenalan di sini sangat ringkas Jika anda memerlukan maklumat yang lebih terperinci dan tidak memasang Perpustakaan MSDN pada komputer anda, anda boleh melihat dokumentasi dalam talian MSDN mengenai elemen bahasa ungkapan biasa.
Jadual 7. Sintaks belum dibincangkan secara terperinci