Ungkapan Biasa - Sintaks


Ungkapan biasa (ungkapan biasa) menerangkan corak padanan rentetan, yang boleh digunakan untuk menyemak sama ada rentetan mengandungi subrentetan tertentu, menggantikan subrentetan yang sepadan atau memilih daripada rentetan tertentu memenuhi syarat tertentu, 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 aksara meta 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 cetakan:

字符描述
cx匹配由x指明的控制字符。例如, cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
f匹配一个换页符。等价于 x0c 和 cL。
n匹配一个换行符。等价于 x0a 和 cJ。
r匹配一个回车符。等价于 x0d 和 cM。
s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ fnrtv]。
S匹配任何非空白字符。等价于 [^ fnrtv]。
t匹配一个制表符。等价于 x09 和 cI。
v匹配一个垂直制表符。等价于 x0b 和 cK。

Watak istimewa

Watak istimewa yang dipanggil ialah aksara dengan makna istimewa, seperti * dalam "*.txt" yang dinyatakan di atas, yang bermaksud 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:

特别字符描述
$匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 'n' 或 'r'。要匹配 $ 字符本身,请使用 $。
( )标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )。
*匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 *。
+匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +。
.匹配除换行符 n之外的任何单字符。要匹配 .,请使用 。
[标记一个中括号表达式的开始。要匹配 [,请使用 [。
?匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 ?。
将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'n' 匹配换行符。序列 '\' 匹配 "",而 '(' 则匹配 "("。
^匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 ^。
{标记限定符表达式的开始。要匹配 {,请使用 {。
|指明两项之间的一个选择。要匹配 |,请使用 |。

Kelayakan Kelayakan

digunakan untuk menentukan berapa kali komponen tertentu ungkapan biasa mesti muncul untuk memenuhi perlawanan. Terdapat 6 jenis: * atau + atau ? atau {n} atau {n,} atau {n,m}.

Kelayakan ungkapan biasa ialah:

字符描述
*匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
+匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
?匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
{n}n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,}n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m}m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

Memandangkan nombor bab berkemungkinan melebihi sembilan dalam dokumen input yang besar, anda memerlukan cara untuk mengendalikan nombor bab dua atau tiga digit. Kelayakan memberi anda keupayaan ini. Ungkapan biasa berikut sepadan dengan tajuk bab bernombor dengan sebarang bilangan digit:

/Chapter [1-9][0-9]*/

Perhatikan bahawa kelayakan muncul selepas ungkapan julat. Oleh itu, ia digunakan untuk keseluruhan ungkapan julat, dalam kes ini, hanya nombor dari 0 hingga 9 (termasuk) ditentukan.

Kelayakan + tidak digunakan di sini kerana tidak semestinya ada keperluan untuk 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.

/Chapter [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 hanya dua digit ialah:

/Chapter [1-9][0-9]?/

atau

/Chapter [1-9][0-9]{0,1}/

Pelayakkan *, + dan ? adalah tamak kerana ia akan memadankan sebanyak mungkin Untuk memadankan teks , padanan tidak tamak atau minimum boleh dicapai dengan menambah ?

Sebagai contoh, anda mungkin mencari dokumen HTML untuk tajuk bab yang disertakan dalam teg H1. Teks kelihatan seperti ini dalam dokumen anda:

<H1>Chapter 1 – Introduction to Regular Expressions</H1>

Ungkapan di bawah sepadan dengan segala-galanya daripada tanda kurang daripada pembukaan (<) kepada tanda lebih besar (>) pada teg H1 penutup.

/<.*>/

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 ungkapan "tidak tamak" atau padanan minimum.

Pencari Pencari

membolehkan 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 ungkapan biasa ialah:

字符描述
^匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 n 或 r 之后的位置匹配。
$匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 n 或 r 之前的位置匹配。
b匹配一个字边界,即字与空格间的位置。
B非字边界匹配。

Nota : Anda tidak boleh menggunakan kelayakan 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 berlaku pada permulaan baris:

/^Chapter [1-9][0-9]{0,1}/

Benar Bukan sahaja tajuk bab 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.

/^Chapter [1-9][0-9]{0,1}$/

Memadankan sempadan perkataan sedikit berbeza, tetapi menambahkan keupayaan penting pada ungkapan biasa. 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 ketiga-tiga aksara ini muncul selepas sempadan perkataan:

/\bCha/

b 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 berlaku sebelum sempadan perkataan:

/ter\b/

Ungkapan berikut sepadan dengan rentetan apt dalam Bab tetapi bukan aksara dalam aptitud String apt:

/\Bapt/

Rentetan apt berlaku pada sempadan bukan perkataan dalam perkataan Bab, tetapi berlaku pada sempadan perkataan dalam perkataan aptitude. Bagi pengendali sempadan bukan perkataan B, kedudukan tidak penting kerana padanan tidak mengambil kira sama ada ia adalah permulaan atau penghujung perkataan.

Pilih

Sertakan semua pilihan dalam kurungan dan pisahkan pilihan bersebelahan dengan |. Tetapi 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 penangkapan, dan dua lagi elemen bukan penangkapan ialah ?= dan ?!. Kedua-dua ini mempunyai lebih banyak makna sebarang permulaan Rentetan carian dipadankan di mana-mana kedudukan dalam corak ungkapan biasa dalam kurungan, yang merupakan pandangan negatif yang sepadan dengan rentetan carian pada mana-mana kedudukan awal 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 ia muncul dari kiri ke kanan. Penomboran 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:

Is is the cost of of gasoline going up up?

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]+) \b/gi

menangkap ungkapan, seperti yang ditentukan oleh [a-z]+, yang merangkumi satu atau lebih huruf. Bahagian kedua ungkapan biasa ialah rujukan kepada subpadanan yang telah ditangkap sebelum ini, iaitu, kejadian kedua perkataan yang dipadankan tepat dengan 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 menguraikan URI berikut kepada protokol (ftp, http, dll.), alamat domain dan halaman/laluan:

http://www.w3cschool.cc:80/html/html-tutorial.html

Ungkapan biasa berikut menyediakan fungsi ini:

/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/

First A subungkapan kurungan 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 yang berikut:

  • Sari-ungkapan kurungan pertama mengandungi "http"

  • Subungkapan kurungan kedua mengandungi "www.w3cschool.cc"

  • Subungkapan kurungan ketiga mengandungi ":80"

  • Yang keempat subungkapan kurungan mengandungi "../html/html-tutorial.html"