Ungkapan biasa - peraturan padanan


Padanan Corak Asas

Semuanya bermula dari asas. Corak ialah elemen paling asas bagi ungkapan biasa Ia adalah satu set aksara yang menerangkan ciri-ciri rentetan. Corak boleh menjadi ringkas, terdiri daripada rentetan biasa, atau sangat kompleks, selalunya menggunakan aksara khas untuk mewakili julat aksara, ulangan atau untuk mewakili konteks. Contohnya:

^once

Corak ini mengandungi aksara khas ^, yang bermaksud bahawa corak itu hanya sepadan dengan rentetan tersebut bermula dengan sekali. Sebagai contoh, corak ini sepadan dengan rentetan "satu masa dahulu" tetapi tidak sepadan dengan "Ada seorang lelaki dari NewYork suatu ketika dahulu". Sama seperti simbol ^ menunjukkan permulaan, simbol $ digunakan untuk memadankan rentetan yang berakhir dengan corak tertentu.

bucket$

Corak ini sepadan dengan "Siapa yang menyimpan semua wang tunai ini dalam baldi" tetapi bukan "baldi". Apabila aksara ^ dan $ digunakan bersama, ia mewakili padanan yang tepat (rentetan adalah sama dengan corak). Contohnya:

^bucket$

hanya sepadan dengan rentetan "baldi". Jika corak tidak termasuk ^ dan $, maka ia sepadan dengan mana-mana rentetan yang mengandungi corak. Contohnya: corak

once

sepadan dengan rentetan

There once was a man from NewYork
Who kept all of his cash in a bucket.

.

Huruf (o-n-c-e) dalam pola ini ialah aksara literal, iaitu, ia mewakili huruf itu sendiri, begitu juga nombor. Aksara lain yang lebih kompleks, seperti tanda baca dan aksara putih (ruang, tab, dsb.), memerlukan urutan melarikan diri. Semua urutan melarikan diri bermula dengan garis miring ke belakang (). Urutan melarikan diri untuk watak tab ialah: t. Jadi jika kita ingin mengesan sama ada rentetan bermula dengan aksara tab, kita boleh menggunakan corak ini:

^\t

Begitu juga, gunakan n untuk mewakili "baris baharu" dan r untuk mewakili pemulangan pengangkutan. Simbol khas lain boleh digunakan dengan garis miring belakang di hadapan Contohnya, garis miring ke belakang itu sendiri diwakili oleh \, noktah diwakili oleh ., dan seterusnya.

Kluster aksara

Dalam program INTERNET, ungkapan biasa biasanya digunakan untuk mengesahkan input pengguna. Apabila pengguna menyerahkan BORANG, ia tidak mencukupi untuk menggunakan aksara literal biasa untuk menentukan sama ada nombor telefon, alamat, alamat e-mel, nombor kad kredit, dsb. yang dimasukkan adalah sah.

Jadi kita perlu menggunakan cara yang lebih bebas untuk menerangkan corak yang kita mahu, iaitu gugusan aksara. Untuk mencipta gugusan yang mewakili semua aksara vokal, letakkan semua aksara vokal dalam kurungan segi empat sama:

[AaEeIiOoUu]

Corak ini sepadan dengan mana-mana aksara vokal, tetapi hanya boleh mewakili satu aksara. Tanda sempang boleh digunakan untuk mewakili julat aksara, seperti:

[a-z] //匹配所有的小写字母 
[A-Z] //匹配所有的大写字母 
[a-zA-Z] //匹配所有的字母 
[0-9] //匹配所有的数字 
[0-9\.\-] //匹配所有的数字,句号和减号 
[ \f\r\t\n] //匹配所有的白字符

Begitu juga, ini juga mewakili satu aksara sahaja, yang sangat penting. Jika anda ingin memadankan rentetan yang terdiri daripada huruf kecil dan digit, seperti "z2", "t6" atau "g7", tetapi bukan "ab2", "r2d3" atau "b52", gunakan corak ini:

^[a-z][0-9]$

Walaupun [a-z] mewakili julat 26 huruf, di sini ia hanya boleh memadankan rentetan di mana aksara pertama ialah huruf kecil.

Telah disebut sebelum ini bahawa ^ mewakili permulaan rentetan, tetapi ia juga mempunyai makna lain. Apabila ^ digunakan dalam set kurungan segi empat sama, ia bermaksud "tidak" atau "kecualikan" dan selalunya digunakan untuk menghapuskan aksara tertentu. Menggunakan contoh sebelumnya, kami memerlukan aksara pertama tidak boleh menjadi nombor:

^[^0-9][0-9]$

Corak ini sepadan dengan "&5", "g7" dan "-2", tetapi tidak sepadan dengan "12", "66" “Ia tidak sepadan. Berikut ialah beberapa contoh mengecualikan aksara tertentu:

[^a-z] //除了小写字母以外的所有字符 
[^\\/\^] //除了(\)(/)(^)之外的所有字符 
[^\"\'] //除了双引号(")和单引号(')之外的所有字符

Aksara khas "." (titik, noktah) digunakan dalam ungkapan biasa untuk mewakili semua aksara kecuali "baris baharu". Jadi corak "^.5$" sepadan dengan mana-mana rentetan dua aksara yang berakhir dengan nombor 5 dan bermula dengan beberapa aksara bukan "baris baharu" yang lain. Corak "." boleh memadankan mana-mana rentetan, kecuali rentetan kosong dan rentetan yang mengandungi hanya "baris baharu".

Ungkapan biasa PHP mempunyai beberapa kelompok aksara biasa terbina dalam, senarainya adalah seperti berikut:

字符簇描述
[[:alpha:]]任何字母
[[:digit:]]任何数字
[[:alnum:]]任何字母和数字
[[:space:]]任何空白字符
[[:upper:]]任何大写字母
[[:lower:]]任何小写字母
[[:punct:]]任何标点符号
[[:xdigit:]]任何16进制的数字,相当于[0-9a-fA-F]

Kenal pasti berulang

Setakat ini, anda sudah tahu Cara memadankan huruf atau nombor, tetapi lebih kerap, ia mungkin perkataan atau sekumpulan nombor. Satu perkataan terdiri daripada beberapa huruf, dan sekumpulan nombor terdiri daripada beberapa nombor tunggal. Tanda kurung kerinting ({}) mengikut aksara atau kelompok aksara digunakan untuk menentukan bilangan kali kandungan sebelumnya diulang.

字符簇描述
^[a-zA-Z_]$所有的字母和下划线
^[[:alpha:]]{3}$所有的3个字母的单词
^a$字母a
^a{4}$aaaa
^a{2,4}$aa,aaa或aaaa
^a{1,3}$a,aa或aaa
^a{2,}$包含多于两个a的字符串
^a{2,}如:aardvark和aaab,但apple不行
a{2,}如:baad和aaa,但Nantucket不行
t{2}两个制表符
.{2}所有的两个字符

Contoh ini menerangkan tiga kegunaan berbeza pendakap kerinting. Nombor, {x} bermaksud "kluster aksara atau aksara sebelumnya muncul hanya x kali"; ,y} bermaksud "kandungan sebelumnya muncul sekurang-kurangnya x kali, tetapi tidak lebih daripada y kali". Kita boleh memanjangkan corak kepada lebih banyak perkataan atau nombor:

^[a-zA-Z0-9_]{1,}$ //所有包含一个以上的字母、数字或下划线的字符串 
^[1-9]{1,}$ //所有的正数 
^\-{0,1}[0-9]{1,}$ //所有的整数 
^[-]?[0-9]+\.?[0-9]+$ //所有的浮点数

Contoh terakhir tidak mudah difahami, bukan? Lihatlah dengan cara ini: dengan segala-galanya bermula dengan tanda tolak pilihan ([-]?) (^), diikuti dengan 1 atau lebih digit ([0-9]+), dan diikuti dengan titik perpuluhan (.) 1 atau lebih digit ([0-9]+) dan tidak diikuti oleh apa-apa lagi ($). Di bawah ini anda akan belajar tentang kaedah yang lebih mudah yang boleh anda gunakan.

Aksara khas "?" adalah sama dengan {0,1}, kedua-duanya mewakili: "0 atau 1 kandungan sebelumnya" atau "kandungan sebelumnya adalah pilihan". Jadi contoh tadi boleh dipermudahkan kepada:

^\-?[0-9]{1,}\.?[0-9]{1,}$

Aksara khas "*" dan {0,} adalah sama, dan kedua-duanya mewakili "0 atau lebih kandungan sebelumnya". Akhir sekali, aksara "+" adalah bersamaan dengan {1,}, yang bermaksud "satu atau lebih kandungan sebelumnya", jadi 4 contoh di atas boleh ditulis sebagai:

^[a-zA-Z0-9_]+$ //所有包含一个以上的字母、数字或下划线的字符串 
^[0-9]+$ //所有的正数 
^\-?[0-9]+$ //所有的整数 
^\-?[0-9]*\.?[0-9]*$ //所有的浮点数

Sudah tentu ini tidak mungkin dari segi teknikal Mengurangkan kerumitan ungkapan biasa tetapi menjadikannya lebih mudah dibaca.