Ungkapan biasa (dengan contoh) - 1

"Dan sekarang saya akan memberitahu anda tentang ungkapan biasa. Topik ini rumit dan mudah pada masa yang sama. Untuk memahami ungkapan biasa secara menyeluruh, anda mungkin perlu membaca dua atau tiga buku yang besar, tetapi saya boleh mengajar anda cara menggunakannya sekarang."

"Sebagai pengaturcara berpengalaman suka bergurau, jika anda mempunyai masalah dan fikir anda akan menyelesaikannya dengan ungkapan biasa, kini anda mempunyai dua masalah."

"Hmm."

"Saya harap saya tidak terlalu menakutkan awak, kawan saya. Tidak?"

"Okay, bagus. Jadi, topik baharu kita ialah ungkapan biasa."

"Jika kita terlalu memudahkannya, ungkapan biasa ialah corak untuk rentetan."

"Anda boleh menyemak sama ada rentetan sepadan dengan corak yang diberikan. Anda juga boleh membelah rentetan kepada bahagian menggunakan pembatas atau corak."

"Tetapi mari kita mulakan dengan sesuatu yang mudah: apakah corak? "

"Dalam SQL (tetapi bukan dalam Java), anda boleh menyemak sama ada rentetan sepadan dengan corak tertentu. Beginilah rupanya:"

name like 'Alex%'

Di sini nama ialah pembolehubah, seperti perintah untuk menyemak corak, dan "Alex%" ialah corak.

Dalam kes ini, % bermaksud sebarang rentetan atau subrentetan.

Corak Rentetan yang sepadan dengan corak
'Alex%' Alex
Alex andr
Alex ander
Alex andra
….
'%x%' Ma x
Ma x im
Ale x andr
'%a' Olg a
Helen dan
Ir a

"Dalam SQL, jika anda perlu menentukan bahawa hanya ada satu aksara lain, maka anda akan menggunakan aksara garis bawah: "_"."

Corak Rentetan yang sepadan dengan corak
'Alex%_' Alex
Alex andr
Alex ander
Alex andra
….
'_x' Ax
Bx
Cx
'___' Aaa
Aab
Bbb

"Yang masuk akal."

"Baiklah, mari kita beralih kepada ungkapan biasa."

"Ungkapan biasa biasanya termasuk sekatan bukan sahaja pada bilangan aksara, tetapi juga 'kandungan' mereka. "Sebarang topeng biasanya terdiri daripada dua (kadang-kadang lebih) bahagian: yang pertama menerangkan 'keutamaan' aksara, dan yang kedua menerangkan bilangan aksara. ."

"Berikut ialah beberapa contoh kandungan :"

Corak Penerangan Contoh
. Mana-mana satu watak 1
\d Mana-mana digit 7
\D Mana-mana bukan digit C
\s Ruang, pemisah baris atau watak tab ''
\S Apa-apa sahaja kecuali ruang, tab dan pemisah baris f
[az] Sebarang huruf dari a hingga z z
[0-9] Mana-mana digit dari 0 hingga 9. 8
\w Apa-apa watak perkataan c
\W Sebarang watak bukan perkataan _

"Saya tidak akan mengingatinya, tetapi ia tidak kelihatan terlalu sukar."

"Cemerlang, maka berikut ialah contoh bilangan aksara dalam topeng: "

Corak Penerangan Contoh
A? Watak 'A' berlaku sekali atau tidak sama sekali A
B+ Watak 'B' berlaku sekali atau lebih BBBB
C* Aksara 'C' berlaku sifar atau lebih kali CCC
D{n} Watak 'D' berlaku n kali Corak D{4} sepadan dengan DDDD
E{n,} Watak 'E' berlaku n atau lebih kali Corak E{2,} sepadan dengan EEEEEEE
F{n,m} Aksara 'F' berlaku antara n dan m kali Corak E{2,4} sepadan dengan EEEE

"Itu semua kelihatan agak mudah."

"Anda memahami segala-galanya dengan begitu pantas. Sekarang mari lihat bagaimana ia kelihatan bersama-sama:"

Corak Penerangan Contoh
[iklan]? Watak antara 'a' dan 'd' berlaku sekali atau tidak sama sekali a, b, c, d
[bd,z]+ Aksara 'b', 'c', 'd' atau 'z' berlaku satu kali atau lebih b, bcdcdbdbdbzzzzbbzbzb, zbz
[1,7-9]* Angka 1, 7, 8 atau 9 berlaku sifar atau lebih kali 1, 7, 9, 9777, 111199
1{5} Angka 1 berlaku 5 kali 11111
[1,2,a,b]{2}{101} Simbol 1, 2, 'a', atau 'b' berlaku dua kali 11, 12, 1a, ab, 2b, bb, 22
[a,0]{2,3} Simbol 'a' atau 0 berlaku 2 atau 3 kali aa, a0,00,0a, aaa,000, a00,0a0, a0a

"Masih semua jelas."

"Betul ke? Hmm. Sama ada saya menerangkan semuanya dengan baik atau awak terlalu cepat mengambilnya. Baiklah, sama ada, itu bagus untuk kita."

"Berikut ialah beberapa cerapan baharu untuk anda."

"Memandangkan ungkapan biasa sering digunakan untuk mencari subrentetan, kami boleh menambah dua lagi aksara (^ dan $) pada corak kami."

"^ bermakna subrentetan mesti termasuk permulaan rentetan."

"$ bermakna subrentetan mesti termasuk hujung rentetan."

"Berikut adalah beberapa contoh:"

Corak Rentetan dan subrentetan yang sepadan dengan corak
a{3} aaa  a  aaa  a  aaa
a{3}$ aaa a aaa a  aaa
^a{3} aaa  a aaa a aaa
^a{3}$ aaa a aaa a aaa

"Dan satu lagi perkara penting."

"Dalam ungkapan biasa, aksara berikut mempunyai makna istimewa: [ ] \ / ^ $ . | ? * + ( ) { }. Ia dipanggil aksara kawalan. Jadi, anda tidak boleh menggunakannya dalam rentetan sahaja."

"Seperti dalam kod Java, mereka mesti dilepaskan. "Dan sekali lagi seperti dalam kod Java, aksara '\' digunakan untuk ini."

"Jika kita ingin menerangkan rentetan yang terdiri daripada tiga '?' aksara, kami tidak boleh menulis '?{3}', kerana '?' ialah watak kawalan. Kita perlu melakukannya seperti ini: \?{3}. Jika kita mahu menggunakan aksara '\', maka kita perlu menulis '\\'."

"OK, faham."

"Dan sekarang inilah satu lagi berita menarik. Dalam fail dengan kod Java, aksara '\' juga mesti dilepaskan dalam rentetan, kerana ia adalah aksara kawalan."

"Sudah tentu."

"Jadi, jika anda cuba mentakrifkan ungkapan biasa Java dalam rentetan, maka anda perlu melepaskan aksara '\' dua kali."

"Ini contohnya:"

Saya mahu topeng yang sepadan dengan 'c:\anything'
Secara teorinya, ungkapan biasa sepatutnya kelihatan seperti ini:
satu aksara 'c',
bertindih,
sengkang ke belakang,
noktah dan asterisk (untuk menandakan sebarang bilangan aksara). Saya menambah ruang untuk meningkatkan kebolehbacaan:
c : \ .*
Tetapi aksara '\' dan '.' perlu dilepaskan, jadi ungkapan biasa akan kelihatan seperti ini:
c :   \\ \. *
Atau, tanpa ruang
c: \\ \. *
"Kita sepatutnya mempunyai tiga garis miring ke belakang dalam ungkapan biasa kita.
Ini bermakna bahawa dalam fail Java ungkapan biasa akan kelihatan seperti ini:"
String regexp = "c: \\\\ \\. *";

"Wah! Wah. Sekarang saya tahu."

"Dan jika anda memutuskan untuk mendalami perkara ini, berikut ialah beberapa pautan yang baik:"

Pelajaran di Wikipedia