Ungkapan biasa - Sintaks
Ungkapan biasa menerangkan corak padanan rentetan yang boleh Ia digunakan untuk memeriksa sama ada rentetan mengandungi subrentetan tertentu, gantikan subrentetan yang sepadan atau ekstrak subrentetan yang memenuhi syarat tertentu daripada rentetan, dsb.
Apabila menyenaraikan direktori, *.txt dalam dir *.txt atau ls *.txt bukan ungkapan biasa, kerana makna * di sini berbeza daripada * dalam ungkapan biasa.
Membina ungkapan biasa adalah sama seperti mencipta ungkapan matematik. Iaitu, ungkapan kecil boleh digabungkan bersama untuk mencipta ungkapan yang lebih besar menggunakan pelbagai metakarakter dan pengendali. Komponen ungkapan biasa boleh menjadi satu aksara, koleksi aksara, julat aksara, pilihan antara aksara atau mana-mana gabungan semua komponen ini.
Ungkapan biasa ialah corak literal yang terdiri daripada aksara biasa (seperti aksara a hingga z) dan aksara khas (dipanggil "metacharacters"). Corak menerangkan satu atau lebih rentetan untuk dipadankan semasa mencari teks. Ungkapan biasa bertindak sebagai templat yang sepadan dengan corak aksara dengan rentetan yang dicari.
Aksara biasa
Aksara biasa termasuk semua aksara boleh cetak dan tidak boleh cetak yang tidak dinyatakan secara eksplisit sebagai aksara meta. Ini termasuk semua huruf besar dan huruf kecil, semua nombor, semua tanda baca dan beberapa simbol lain.
Aksara bukan cetak
Aksara bukan cetak juga boleh menjadi sebahagian daripada ungkapan biasa. Jadual berikut menyenaraikan urutan melarikan diri yang mewakili aksara bukan pencetakan:
Watak istimewa
jadi- dipanggil Aksara khas ialah aksara dengan makna istimewa, seperti * dalam "*.txt" yang disebut di atas secara ringkas, ia mewakili maksud mana-mana rentetan. Jika anda ingin mencari fail dengan * dalam nama fail, anda perlu melepaskan *, iaitu, tambah satu di hadapannya. ls *.txt.
Banyak aksara meta memerlukan layanan istimewa apabila cuba memadankannya. Untuk memadankan watak-watak istimewa ini, anda mesti "melarikan diri" daripada watak-watak tersebut, iaitu, mendahuluinya dengan aksara sengkang ke belakang (). Jadual berikut menyenaraikan aksara khas dalam ungkapan biasa:
Kelayakan Kelayakan
digunakan untuk menentukan berapa kali komponen tertentu bagi ungkapan biasa mesti muncul untuk memenuhi perlawanan. Terdapat 6 jenis: * atau + atau ? atau {n} atau {n,} atau {n,m}.
Kelayakan ungkapan biasa ialah:
Memandangkan nombor bab mungkin akan melebihi sembilan dalam dokumen input yang besar, anda memerlukan cara untuk mengendalikan dua atau tiga -digit nombor bab. Kelayakan memberi anda keupayaan ini. Ungkapan biasa berikut sepadan dengan tajuk bab bernombor dengan sebarang bilangan digit:
/Bab [1-9][0-9]*/
Perhatikan bahawa kelayakan muncul selepas ungkapan julat. Oleh itu, ia digunakan pada keseluruhan ungkapan julat, dalam kes ini, hanya nombor daripada 0 hingga 9 termasuk.
Kelayakan + tidak digunakan di sini kerana tidak semestinya ada keperluan untuk mempunyai nombor di kedudukan kedua atau seterusnya. Jangan gunakannya juga? aksara kerana ia mengehadkan nombor bab kepada dua digit sahaja. Anda perlu memadankan sekurang-kurangnya satu nombor selepas Bab dan aksara ruang.
Jika anda tahu bahawa nombor bab dihadkan kepada 99 bab sahaja, anda boleh menggunakan ungkapan berikut untuk menentukan sekurang-kurangnya satu tetapi paling banyak dua digit.
/Bab [0-9]{1,2}/
Kelemahan ungkapan di atas ialah nombor bab yang lebih besar daripada 99 masih hanya sepadan dengan dua digit pertama. Kelemahan lain ialah Bab 0 juga akan sepadan. Ungkapan yang lebih baik untuk memadankan dua digit sahaja ialah:
/Bab [1-9][0-9]?/
atau
/ Bab [ 1-9][0-9]{0,1}/
*, + dan ? yang layak adalah tamak kerana mereka akan memadankan sebanyak mungkin literal, hanya jika Menambahkan ? mencapai padanan tidak tamak atau minimum.
Sebagai contoh, anda mungkin mencari dokumen HTML untuk tajuk bab yang disertakan dalam teg H1. Teks kelihatan seperti ini dalam dokumen anda:
<H1>Bab 1 – Pengenalan kepada Ungkapan Biasa</H1>
Ungkapan berikut sepadan bermula dengan simbol kurang ( < Semuanya daripada ;) hingga tanda lebih besar (>) yang menutup teg H1.
/<.*>/
Jika anda hanya perlu memadankan teg H1 pembukaan, ungkapan "tidak tamak" berikut hanya sepadan dengan <H1>.
/<.*?>/
Dengan meletakkan ? selepas *, + atau ?, ungkapan ditukar daripada ungkapan "tamak" kepada "bukan -ekspresi rakus" Ekspresi tamak" atau padanan minimum.
pencari
Pencarimembolehkan anda menyemat ungkapan biasa pada permulaan atau penghujung baris. Ia juga membolehkan anda membuat ungkapan biasa yang muncul dalam perkataan, pada permulaan perkataan, atau pada akhir perkataan. Pencari
digunakan untuk menerangkan sempadan rentetan atau perkataan, ^ dan $ merujuk kepada permulaan dan penghujung rentetan masing-masing, b menerangkan sempadan depan atau belakang perkataan, dan B mewakili a sempadan bukan perkataan.
Kelayakan untuk ungkapan biasa ialah:
Nota: Pelayakkan tidak boleh digunakan dengan mata sauh. Memandangkan tidak boleh ada lebih daripada satu kedudukan sejurus sebelum atau selepas sempadan baris atau perkataan baharu, ungkapan seperti ^* tidak dibenarkan.
Untuk memadankan teks pada permulaan baris teks, gunakan aksara ^ pada permulaan ungkapan biasa. Jangan mengelirukan penggunaan ^ ini dengan penggunaan ungkapan kurungan dalam.
Untuk memadankan teks pada penghujung baris teks, gunakan aksara $ di hujung ungkapan biasa.
Untuk menggunakan mata utama semasa mencari tajuk bab, ungkapan biasa berikut sepadan dengan tajuk bab yang mengandungi hanya dua digit di belakang dan muncul pada permulaan baris:
/^ Bab [1 -9][0-9]{0,1}/
Bukan sahaja tajuk bab sebenar muncul pada permulaan baris, tetapi ia juga satu-satunya teks dalam baris. Ia muncul pada permulaan baris dan pada penghujung baris yang sama. Ungkapan berikut memastikan bahawa padanan yang ditentukan hanya sepadan dengan bab dan bukan rujukan silang. Anda boleh melakukan ini dengan mencipta ungkapan biasa yang hanya sepadan dengan permulaan dan penghujung baris teks.
/^Bab [1-9][0-9]{0,1}$/
sepadan dengan sempadan perkataan sedikit berbeza, tetapi menambahkan banyak kepada kebolehan penting regex . Sempadan perkataan ialah kedudukan antara perkataan dan ruang. Sempadan bukan perkataan ialah sebarang kedudukan lain. Ungkapan berikut sepadan dengan tiga aksara pertama perkataan Bab kerana tiga aksara ini muncul selepas sempadan perkataan:
/bCha/
Kedudukan aksara b adalah sangat penting. Ia mencari padanan pada permulaan perkataan jika ia berada di awal rentetan untuk dipadankan. Jika ia berada di hujung rentetan, ia mencari padanan di hujung perkataan. Sebagai contoh, ungkapan berikut sepadan dengan rentetan ter dalam perkataan Bab kerana ia muncul sebelum sempadan perkataan:
/terb/
Ungkapan berikut sepadan dengan rentetan dalam Bab Rentetan apt, tetapi tidak sepadan dengan rentetan apt dalam aptitud:
/Bapt/
Rentetan apt berlaku pada sempadan bukan perkataan dalam perkataan Bab, tetapi tidak berlaku pada sempadan perkataan Pada sempadan perkataan dalam kebolehan. Bagi pengendali sempadan bukan perkataan B, kedudukan tidak penting kerana padanan tidak mengambil kira sama ada ia permulaan atau penghujung perkataan.
Pilih
Sisipkan semua pilihan dalam kurungan dan pisahkan pilihan bersebelahan dengan |. Walau bagaimanapun, menggunakan kurungan akan mempunyai kesan sampingan, iaitu padanan yang berkaitan akan dicache Dalam kes ini, anda boleh menggunakan ?: sebelum pilihan pertama untuk menghapuskan kesan sampingan ini.
Antaranya, ?: ialah salah satu elemen bukan menangkap, dan dua lagi elemen bukan menangkap ialah ?= dan ?!. Kedua-dua ini mempunyai lebih banyak makna mana-mana kurungan. Corak ungkapan biasa sepadan dengan rentetan carian pada mana-mana kedudukan yang tidak sepadan dengan corak ungkapan biasa, yang berpandangan negatif dan sepadan dengan rentetan carian pada mana-mana kedudukan permulaan yang tidak sepadan dengan corak ungkapan biasa.
Rujukan Belakang
Menambah kurungan di sekeliling corak ungkapan biasa atau sebahagian daripada corak akan menyebabkan padanan yang berkaitan disimpan dalam penimbal sementara, dengan setiap subpadanan ditangkap seperti yang dinyatakan dalam corak ungkapan biasa. Ungkapan disimpan dalam susunan yang muncul dari kiri ke kanan. Nombor penimbal bermula pada 1 dan boleh menyimpan sehingga 99 subungkapan yang ditangkap. Setiap penimbal boleh diakses menggunakan 'n', di mana n ialah nombor perpuluhan satu atau dua digit yang mengenal pasti penimbal tertentu.
Tangkapan boleh diganti menggunakan aksara meta bukan tangkap '?:', '?=' atau '?!', mengabaikan penjimatan padanan yang berkaitan.
Salah satu aplikasi rujukan belakang yang paling mudah dan berguna ialah keupayaan untuk mencari padanan dua perkataan bersebelahan yang serupa dalam teks. Ambil ayat berikut sebagai contoh:
Adakah kos petrol naik?
Ayat di atas jelas mempunyai beberapa perkataan berulang. Adalah baik untuk mencipta cara untuk mencari ayat ini tanpa perlu mencari ulangan setiap perkataan. Ungkapan biasa berikut menggunakan subungkapan tunggal untuk mencapai ini:
/b([a-z]+) 1b/gi
menangkap ungkapan seperti [a-z] + Ditentukan, termasuk satu atau lebih huruf. Bahagian kedua ungkapan biasa ialah rujukan kepada subpadanan yang telah ditangkap sebelum ini, iaitu, kejadian kedua perkataan yang dipadankan dengan tepat oleh ungkapan kurungan. 1 menentukan subpadanan pertama. Metakarakter sempadan perkataan memastikan bahawa hanya keseluruhan perkataan dikesan. Jika tidak, frasa seperti "dikeluarkan" atau "ini" tidak akan dikenali dengan betul oleh ungkapan ini.
Teg global (g) selepas ungkapan biasa mengarahkan bahawa ungkapan itu digunakan pada seberapa banyak padanan yang boleh ditemui dalam rentetan input. Teg tidak peka huruf besar-kecil (i) pada penghujung ungkapan menentukan tidak sensitif huruf besar-besaran. Teg berbilang baris menentukan padanan berpotensi yang mungkin berlaku pada kedua-dua belah aksara baris baharu.
Rujukan belakang juga memecahkan Penunjuk Sumber Sejagat (URI) kepada komponennya. Katakan anda ingin memecahkan URI berikut kepada protokol (ftp, http, dll.), alamat domain dan halaman/laluan:
http://www.php.cn:80/html/html-tutorial. html
Ungkapan biasa berikut menyediakan kefungsian ini:
/(w+)://([^/:]+)(:d*)?([^# ] *)/
Subungkapan kurungan pertama menangkap bahagian protokol alamat web. Subungkapan ini sepadan dengan mana-mana perkataan yang didahului oleh titik bertindih dan dua garis miring ke hadapan. Subungkapan kurungan kedua menangkap bahagian alamat domain alamat. Subungkapan sepadan dengan satu atau lebih aksara kecuali / dan :. Subungkapan kurungan ketiga menangkap nombor port (jika satu dinyatakan). Subungkapan ini sepadan dengan sifar atau lebih digit berikutan titik bertindih. Subungkapan ini boleh diulang sekali sahaja. Akhir sekali, subungkapan kurungan keempat menangkap maklumat laluan dan/atau halaman yang ditentukan oleh alamat Web. Subungkapan ini sepadan dengan mana-mana jujukan aksara yang tidak termasuk aksara # atau ruang.
Menggunakan ungkapan biasa pada URI di atas, setiap subpadanan mengandungi perkara berikut:
Subungkapan kurungan pertama mengandungi "http"
Ungkapan kedua Subungkapan kurungan pertama mengandungi "www .php.cn"
Subungkapan kurungan ketiga mengandungi ":80"
Subungkapan kurungan keempat mengandungi "../html /html-tutorial.html"
Untuk lebih banyak pengetahuan ungkapan biasa, lihat http://php.cn/regexp/regexp-tutorial.html
Lebih banyak ungkapan biasa Untuk contoh formula, lihat http://www.cnblogs .com/diony/archive/2010/12/16/1908499.html
bahagian seterusnya