JavaRush /Blog Java /Random-MS /RegEx: 20 langkah pendek untuk menguasai ungkapan biasa. ...
Artur
Tahap
Tallinn

RegEx: 20 langkah pendek untuk menguasai ungkapan biasa. Bahagian 3

Diterbitkan dalam kumpulan
RegEx: 20 langkah pendek untuk menguasai ungkapan biasa. Bahagian 1. RegEx: 20 langkah pendek untuk menguasai ungkapan biasa. Bahagian 2: Dalam bahagian ini kita akan beralih kepada perkara yang lebih kompleks sedikit. Tetapi menguasai mereka, seperti sebelumnya, tidak akan sukar. Saya ulangi bahawa RegEx sebenarnya lebih mudah daripada yang mungkin kelihatan pada mulanya, dan anda tidak perlu menjadi saintis roket untuk menguasainya dan mula menggunakannya dalam amalan. Asal bahasa Inggeris artikel ini ada di sini . 20 langkah pendek untuk menguasai ungkapan biasa.  Bahagian 3 - 1

Langkah 11: Tanda kurung ()sebagai Kumpulan Menangkap

20 langkah pendek untuk menguasai ungkapan biasa.  Bahagian 3 - 2Dalam masalah terakhir, kami mencari pelbagai jenis nilai integer dan nilai angka terapung (titik). Tetapi enjin ungkapan biasa tidak membezakan antara kedua-dua jenis nilai ini, kerana semuanya telah ditangkap dalam satu ungkapan biasa yang besar. Kami boleh memberitahu enjin ungkapan biasa untuk membezakan antara jenis padanan yang berbeza jika kami menyertakan corak mini kami dalam kurungan:
corak: ([AZ])|([az]) 
rentetan:   Presiden Bolivia semasa ialah Evo Morales .
perlawanan: ^^^ ^^^^^^^ ^^^^^^^^^ ^^ ^^^^^^^ ^^ ^^^ ^^^^^^^ 
kumpulan:    122 2222222 122222222 22 1222222 22 122 1222222  
( Contoh ) Ungkapan biasa di atas mentakrifkan dua kumpulan tangkapan yang diindeks bermula pada 1. Kumpulan tangkapan pertama sepadan dengan mana-mana huruf besar tunggal, dan kumpulan tangkapan kedua sepadan dengan mana-mana huruf kecil tunggal. Dengan menggunakan tanda 'atau' |dan kurungan ()sebagai kumpulan penangkap, kita boleh mentakrifkan satu ungkapan biasa yang sepadan dengan pelbagai jenis rentetan. Jika kami menggunakan ini pada regex carian panjang/terapung kami dari bahagian sebelumnya artikel, maka enjin regex akan menangkap padanan yang sepadan dalam kumpulan yang sesuai. Dengan menyemak kumpulan mana subrentetan sepadan, kami boleh menentukan dengan segera sama ada ia adalah nilai apungan atau nilai panjang:
corak: (\d*\.\d+[fF]|\d+\.\d*[fF]|\d+[fF])|(\d+[lL]) 
rentetan:   42L 12 x 3.4f 6l 3.3 0F LF .2F 0.
perlawanan: ^^^ ^^^^ ^^ ^^ ^^^ 
kumpulan:    222 1111 22 11 111  
( Contoh ) Ungkapan biasa ini agak rumit, dan untuk memahaminya dengan lebih baik, mari kita pecahkan dan lihat setiap corak ini:
( // sepadan dengan mana-mana subrentetan "terapung".
  \d*\.\d+[fF]
  |
  \d+\.\d*[fF]
  |
  \d+[fF]
)
| // ATAU
( // sepadan dengan mana-mana subrentetan "panjang".
  \d+[lL]
)
Tanda |dan kumpulan penangkapan dalam kurungan ()membolehkan kami memadankan pelbagai jenis subrentetan. Dalam kes ini, kami memadankan sama ada nombor titik terapung "terapung" atau integer panjang "panjang".
(
  \d*\.\d+[fF] // 1+ digit di sebelah kanan titik perpuluhan
  |
  \d+\.\d*[fF] // 1+ digit di sebelah kiri titik perpuluhan
  |
  \d+[fF] // tiada titik, hanya 1+ digit
)
|
(
  \d+[lL] // tiada titik, hanya 1+ digit
)
Dalam kumpulan tangkapan "terapung", kami mempunyai tiga pilihan: nombor dengan sekurang-kurangnya 1 digit di sebelah kanan titik perpuluhan, nombor dengan sekurang-kurangnya 1 digit di sebelah kiri titik perpuluhan dan nombor tanpa titik perpuluhan. Mana-mana daripadanya adalah "terapung" asalkan mempunyai huruf "f" atau "F" yang dilampirkan di hujungnya. Di dalam kumpulan tangkapan "panjang" kita hanya mempunyai satu pilihan - kita mesti mempunyai 1 atau lebih digit diikuti dengan aksara "l" atau "L". Enjin ungkapan biasa akan mencari subrentetan ini dalam rentetan tertentu dan mengindeksnya ke dalam kumpulan tangkapan yang sesuai. Notabahawa kami tidak memadankan mana-mana nombor yang tidak mempunyai sebarang "l", "L", "f" atau "F" yang ditambahkan pada mereka. Bagaimanakah nombor ini harus dikelaskan? Nah, jika mereka mempunyai titik perpuluhan, bahasa Java lalai kepada "berganda". Jika tidak, mereka mesti "int".

Mari kita satukan apa yang telah kita pelajari dengan beberapa teka-teki:

Tambahkan dua lagi kumpulan tangkapan pada regex di atas supaya ia turut mengklasifikasikan nombor berganda atau int. (Ini adalah satu lagi soalan rumit, jangan berkecil hati jika ia mengambil sedikit masa, sebagai pilihan terakhir lihat penyelesaian saya.)
corak:
rentetan:   42L 12 x 3.4f 6l 3.3 0F LF .2F 0. 
padanan: ^^^ ^^ ^^^^ ^^ ^^^ ^^ ^^^ ^^ 
kumpulan:    333 44 1111 33 222 11 111 22
( Penyelesaian ) Masalah seterusnya adalah lebih mudah sedikit. Gunakan kumpulan tangkapan kurungan (), tanda 'atau' |dan julat aksara untuk mengisih umur berikut: "sah untuk diminum di AS." (>= 21) dan "tidak dibenarkan minum di AS" (<21):
corak:
rentetan:   7 10 17 18 19 20 21 22 23 24 30 40 100 120 
padanan: ^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ 
kumpulan:    2 22 22 22 22 22 11 11 11 11 11 11 11 111 111 
( Penyelesaian )

Langkah 12: Kenal pasti Padanan Yang Lebih Spesifik Dahulu

20 langkah pendek untuk menguasai ungkapan biasa.  Bahagian 3 - 3Anda mungkin menghadapi masalah dengan tugas terakhir jika anda cuba menentukan "peminum sah" sebagai kumpulan tangkapan pertama dan bukannya kumpulan kedua. Untuk memahami sebabnya, mari lihat contoh lain. Katakan kita ingin merekodkan nama keluarga yang mengandungi kurang daripada 4 aksara dan nama keluarga yang mengandungi 4 atau lebih aksara secara berasingan. Mari berikan nama yang lebih pendek kepada kumpulan tangkapan pertama dan lihat apa yang berlaku:
corak: ([AZ][az]?[az]?)|([AZ][az][az][az]+) 
rentetan:   Kim Job s Xu Clo yd Moh r Ngo Roc k.
perlawanan: ^^^ ^^^ ^^ ^^^ ^^^ ^^^ ^^^ 
kumpulan:    111 111 11 111 111 111 111   
( Contoh ) Secara lalai, kebanyakan enjin ungkapan biasa menggunakan padanan tamak terhadap aksara asas yang telah kita lihat setakat ini. Ini bermakna bahawa enjin ungkapan biasa akan menangkap kumpulan terpanjang yang ditakrifkan seawal mungkin dalam ungkapan biasa yang disediakan. Jadi, walaupun kumpulan kedua di atas boleh menangkap lebih banyak aksara dalam nama seperti "Jobs" dan "Cloyd" sebagai contoh, tetapi memandangkan tiga aksara pertama nama tersebut telah ditangkap oleh kumpulan tangkapan pertama, mereka tidak boleh ditangkap lagi oleh yang kedua . Sekarang mari kita buat pembetulan kecil - cuma tukar susunan kumpulan tangkapan, letakkan kumpulan yang lebih khusus (lebih lama) dahulu:
corak: ([AZ][az][az][az]+)|([AZ][az]?[az]?) 
rentetan:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
perlawanan: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
kumpulan:    222 1111 22 11111 1111 222 1111    
( Contoh )

Tugasan... kali ini hanya satu :)

Corak "lebih khusus" hampir selalu bermaksud "lebih lama". Katakan kita ingin mencari dua jenis "perkataan": pertama yang bermula dengan vokal (lebih khusus), kemudian yang tidak bermula dengan vokal (apa-apa perkataan lain). Cuba tulis ungkapan biasa untuk menangkap dan mengenal pasti rentetan yang sepadan dengan dua kumpulan ini. (Kumpulan di bawah adalah berhuruf dan bukannya bernombor. Anda mesti menentukan kumpulan mana yang sepadan dengan yang pertama dan yang mana dengan yang kedua.)
corak:
rentetan:   pds6f uub 24r2gp ewqrty l ui_op 
padanan: ^^^^^ ^^^ ^^^^^^ ^^^^^^ ^ ^^^^^ 
kumpulan:    NNNNN VVV NNNNNN VVVVVV N VVVVV
( Penyelesaian ) Secara umum, lebih tepat ungkapan biasa anda, lebih lama ia akan berakhir. Dan lebih tepat ia, semakin kecil kemungkinan anda akan menangkap sesuatu yang anda tidak perlukan. Jadi walaupun mereka mungkin kelihatan menakutkan, regex yang lebih panjang ~= regex yang lebih baik. Malangnya .

Langkah 13: Pendakap kerinting {}untuk bilangan ulangan tertentu

20 langkah pendek untuk menguasai ungkapan biasa.  Bahagian 3 - 4Dalam contoh dengan nama akhir dari langkah sebelumnya, kami mempunyai 2 kumpulan yang hampir berulang dalam satu corak:
corak: ([AZ][az][az][az]+)|([AZ][az]?[az]?) 
rentetan:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
perlawanan: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
kumpulan:    222 1111 22 11111 1111 222 1111    
Untuk kumpulan pertama, kami memerlukan nama keluarga dengan empat atau lebih huruf. Kumpulan kedua terpaksa menangkap nama keluarga dengan tiga atau kurang huruf. Adakah terdapat cara yang lebih mudah untuk menulis ini daripada mengulangi [a-z]kumpulan ini berulang kali? Wujud jika anda menggunakan pendakap kerinting untuk ini {}. Pendakap kerinting {}membolehkan kami menentukan bilangan minimum dan (pilihan) maksimum padanan watak atau kumpulan tangkapan sebelumnya. Terdapat tiga kes penggunaan {}:
{X} // sepadan dengan tepat X kali
{X,} // padanan >= X kali
{X,Y} // padanan >= X dan <= Y kali
Berikut ialah contoh tiga sintaks yang berbeza ini:
corak: [az]{11} 
rentetan:   humuhumunuk unukuapua'a.
perlawanan: ^^^^^^^^^^   
( Contoh )
corak: [az]{18,} 
rentetan:   humuhumunukunukuapua 'a.
perlawanan: ^^^^^^^^^^^^^^^^^^^^^^^^    
( Contoh )
corak: [az]{11,18} 
rentetan:   humuhumunukunukukap ua'a.
perlawanan: ^^^^^^^^^^^^^^^^^^^^    
( Contoh ) Terdapat beberapa perkara yang perlu diperhatikan dalam contoh di atas.Nota:. Mula-mula, menggunakan tatatanda {X}, aksara atau kumpulan sebelumnya akan sepadan dengan nombor (X) kali itu. Jika terdapat lebih banyak aksara dalam "perkataan" (daripada nombor X) yang boleh sepadan dengan corak (seperti yang ditunjukkan dalam contoh pertama), maka ia tidak akan disertakan dalam padanan. Jika bilangan aksara kurang daripada X, maka padanan penuh akan gagal (cuba tukar 11 hingga 99 dalam contoh pertama). Kedua, tatatanda {X,} dan {X,Y} adalah tamak. Mereka akan cuba memadankan seberapa banyak aksara yang mungkin sambil tetap memenuhi ungkapan biasa yang diberikan. Jika anda menyatakan {3,7} maka 3 hingga 7 aksara boleh dipadankan dan jika 7 aksara seterusnya adalah sah maka kesemua 7 aksara akan dipadankan. Jika anda menentukan {1,} dan semua 14,000 aksara seterusnya sepadan, maka kesemua 14,000 aksara tersebut akan dimasukkan dalam rentetan yang sepadan. Bagaimanakah kita boleh menggunakan pengetahuan ini untuk menulis semula ungkapan kita di atas? Penambahbaikan yang paling mudah mungkin adalah untuk menggantikan kumpulan jiran [a-z]dengan [a-z]{N}, di mana N dipilih dengan sewajarnya:
corak: ([AZ][az]{2}[az]+)|([AZ][az]?[az]?)  
... tetapi itu tidak menjadikan keadaan lebih baik. Lihat kumpulan tangkapan pertama: kita ada [a-z]{2}(yang sepadan dengan tepat 2 huruf kecil) diikuti dengan [a-z]+(yang sepadan dengan 1 atau lebih huruf kecil). Kita boleh memudahkan ini dengan meminta 3 atau lebih huruf kecil menggunakan pendakap kerinting:
corak: ([AZ][az]{3,})|([AZ][az]?[az]?) 
Kumpulan tangkap kedua adalah berbeza. Kami memerlukan tidak lebih daripada tiga aksara dalam nama akhir ini, yang bermaksud kami mempunyai had atas, tetapi had bawah kami ialah sifar:
corak: ([AZ][az]{3,})|([AZ][az]{0,2}) 
Kekhususan sentiasa lebih baik apabila menggunakan ungkapan biasa, jadi adalah bijak untuk berhenti di sana, tetapi saya tidak dapat mengelak daripada melihat bahawa kedua-dua julat aksara ( [AZ]dan [az]) bersebelahan antara satu sama lain kelihatan hampir seperti kelas "watak perkataan", \w( [A-Za-z0-9_]) . Jika kami yakin bahawa data kami hanya mengandungi nama keluarga yang diformat dengan baik, maka kami boleh memudahkan ungkapan biasa kami dengan hanya menulis:
corak: (\w{4,})|(\w{1,3}) 
Kumpulan pertama menangkap mana-mana urutan 4 atau lebih "aksara perkataan" ( [A-Za-z0-9_]), dan kumpulan kedua menangkap sebarang jujukan daripada 1 hingga 3 "aksara perkataan" (termasuk). Adakah ini akan berkesan?
corak: (\w{4,})|(\w{1,3}) 
rentetan:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
perlawanan: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
kumpulan:    222 1111 22 11111 1111 222 1111    
( Contoh ) Ia berjaya! Bagaimana pula dengan pendekatan ini? Dan ia jauh lebih bersih daripada contoh kami sebelum ini. Memandangkan kumpulan tangkapan pertama memadankan semua nama keluarga dengan empat atau lebih aksara, kita juga boleh menukar kumpulan tangkapan kedua kepada hanya \w+, kerana ini membolehkan kita menangkap semua nama keluarga yang tinggal (dengan 1, 2 atau 3 aksara):
corak: (\w{4,})|(\w+) 
rentetan:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
perlawanan: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
kumpulan:    222 1111 22 11111 1111 222 1111    
( Contoh )

Mari bantu otak mempelajari perkara ini dan selesaikan 2 masalah berikut:

Gunakan pendakap kerinting {}untuk menulis semula ungkapan biasa carian nombor keselamatan sosial dari langkah 7:
corak:
rentetan: 113-25=1902 182-82-0192 H23-_3-9982 1I1-O0-E38B
perlawanan:              ^^^^^^^^^^
( Penyelesaian ) Andaikan bahawa penyemak kekuatan kata laluan tapak web memerlukan kata laluan pengguna antara 6 dan 12 aksara. Tulis ungkapan biasa yang menandakan kata laluan yang tidak sah dalam senarai di bawah. Setiap kata laluan terkandung dalam kurungan ()untuk pemadanan yang mudah, jadi pastikan ungkapan biasa bermula dan berakhir dengan aksara literal (dan simbolik. )Petunjuk: pastikan anda tidak membenarkan kurungan literal dalam kata laluan dengan [^()]atau serupa, jika tidak, anda akhirnya akan memadankan keseluruhan rentetan!
corak:
rentetan:   (12345) (kata laluan saya) (Xanadu.2112) (su_do) (OfSalesmen!)
perlawanan: ^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^  
( Penyelesaian )

Langkah 14: \bSimbol Sempadan Lebar Sifar

20 langkah pendek untuk menguasai ungkapan biasa.  Bahagian 3 - 5Tugasan terakhir agak sukar. Tetapi bagaimana jika kita menjadikannya lebih rumit dengan melampirkan kata laluan dalam petikan ""dan bukannya kurungan ()? Bolehkah kita menulis penyelesaian yang serupa dengan hanya menggantikan semua aksara kurungan dengan aksara petikan?
corak: \"[^"]{0.5}\"|\"[^"]+\s[^"]*\" 
rentetan:   "12345" "kata laluan saya" "Xanadu.2112 " " su_do" " OfSalesmen! "
perlawanan: ^^^^^^^ ^^^^^^^^^^^^^^^ ^^^ ^^^  
( Contoh ) Ia ternyata tidak begitu mengagumkan. Adakah anda sudah meneka mengapa? Masalahnya ialah kami mencari kata laluan yang salah di sini. "Xanadu.2112" ialah kata laluan yang baik, jadi apabila regex menyedari bahawa urutan ini tidak mengandungi ruang atau aksara literal ", ia menghasilkan tepat sebelum aksara "yang melayakkan kata laluan di sebelah kanan. (Kerana kami menyatakan bahawa aksara "tidak boleh ditemui di dalam kata laluan menggunakan [^"].) Setelah enjin ungkapan biasa berpuas hati bahawa aksara tersebut tidak sepadan dengan ungkapan biasa tertentu, ia berjalan semula, tepat di tempat ia berhenti - di mana watak itu berada ". yang mengehadkan " Xanadu.2112" di sebelah kanan. Dari situ dia melihat satu watak ruang, dan satu lagi watak "- baginya ini adalah kata laluan yang salah! Pada asasnya, dia menemui urutan ini " "dan teruskan. Ini sama sekali bukan perkara yang kita ingin dapatkan... Alangkah baiknya jika kita dapat menentukan bahawa aksara pertama kata laluan itu tidak sepatutnya menjadi ruang. Adakah terdapat cara untuk melakukan ini? (Sekarang, anda mungkin telah menyedari bahawa jawapan kepada semua soalan retorik saya ialah "ya.") Ya! Terdapat cara sedemikian! Banyak enjin ungkapan biasa menyediakan urutan pelarian seperti "sempadan perkataan" \b. "Sempadan perkataan" \bialah urutan pelarian lebar sifar yang, anehnya, sepadan dengan sempadan perkataan. Ingat bahawa apabila kita menyebut "perkataan", kita bermaksud sama ada sebarang jujukan aksara dalam kelas \watau [A-Za-z0-9_]. Padanan sempadan perkataan bermaksud watak sejurus sebelum atau sejurus selepas urutan \bmestilah неwatak perkataan. Walau bagaimanapun, apabila memadankan, kami tidak memasukkan watak ini dalam subrentetan yang ditangkap. Ini adalah lebar sifar. Untuk melihat cara ini berfungsi, mari lihat contoh kecil:
corak: \b[^ ]+\b 
rentetan:   Anda masih memerlukan wang , Lebowski .
perlawanan: ^^ ^^^^^ ^^^^ ^^ ^^^^^ ^^^^^^^^  
( Contoh ) Urutan [^ ]mesti sepadan dengan mana-mana aksara yang bukan aksara ruang literal. Jadi mengapa ini tidak sepadan dengan koma ,selepas wang atau noktah " .selepas Lebowski? Ini kerana koma ,dan noktah .bukanlah aksara perkataan, jadi sempadan dicipta antara aksara perkataan dan aksara bukan perkataan. Ia muncul di antara ypenghujung perkataan wang dan koma ,yang mengikutinya. dan antara " iperkataan Lebowski dan noktah .( noktah / noktah) yang mengikutinya. Ungkapan biasa sepadan dengan sempadan perkataan ini (tetapi bukan pada aksara bukan perkataan yang hanya membantu mentakrifkannya). Tetapi apa yang berlaku jika kami tidak memasukkan konsistensi \bdalam templat kami?
corak: [^ ]+ 
rentetan:   Anda masih memerlukan wang, Lebowski. 
perlawanan: ^^ ^^^^^ ^^^^ ^^ ^^^^^^ ^^^^^^^^^  
( Contoh ) Ya, sekarang kita dapati tanda baca ini juga. Sekarang mari kita gunakan sempadan perkataan untuk membetulkan regex untuk kata laluan yang disebut:
corak: \"\b[^"]{0.5}\b\"|\"\b[^"]+\s[^"]*\b\" 
rentetan:   "12345" "kata laluan saya" " Xanadu. 2112" "su_do" "OfSalesmen!"
perlawanan: ^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^  
( Contoh ) Dengan meletakkan sempadan perkataan di dalam tanda petikan ("\b ... \b"), kami dengan berkesan mengatakan bahawa aksara pertama dan terakhir kata laluan yang sepadan mestilah "aksara perkataan". Jadi ini berfungsi dengan baik di sini, tetapi tidak akan berfungsi juga jika aksara pertama atau terakhir kata laluan pengguna bukan aksara perkataan:
corak: \"\b[^"]{0.5}\b\"|\"\b[^"]+\s[^"]*\b\"
rentetan: "thefollowingpasswordistooshort" "C++"
perlawanan:   
( Contoh ) Lihat bagaimana kata laluan kedua tidak ditandakan sebagai "tidak sah" walaupun ia jelas terlalu pendek. anda mestiberhati-hatidengan urutan \b, kerana ia hanya sepadan dengan sempadan antara watak \wdan bukan \w. Dalam contoh di atas, kerana kami membenarkan aksara not , dalam kata laluan \w, sempadan antara \dan aksara pertama/terakhir kata laluan tidak dijamin sebagai sempadan perkataan \b.

Untuk melengkapkan langkah ini, kami akan menyelesaikan hanya satu masalah mudah:

Sempadan perkataan berguna dalam enjin penonjolan sintaks apabila kita ingin memadankan jujukan aksara tertentu, tetapi ingin memastikan ia hanya berlaku pada permulaan atau akhir perkataan (atau sendiri). Katakan kita sedang menulis penyerlahan sintaks dan ingin menyerlahkan perkataan var, tetapi hanya apabila ia muncul dengan sendiri (tanpa menyentuh aksara lain dalam perkataan). Bolehkah anda menulis ungkapan biasa untuk ini? Sudah tentu anda boleh, ia adalah tugas yang sangat mudah;)
corak:
rentetan:   var varx _var ( var j) barvarcar * var var -> { var }
perlawanan: ^^^ ^^^ ^^^ ^^^ ^^^  
( Penyelesaian )

Langkah 15: "karet" ^sebagai "permulaan baris" dan tanda dolar $sebagai "akhir baris"

20 langkah pendek untuk menguasai ungkapan biasa.  Bahagian 3 - 6Perkataan jujukan sempadan \b(dari langkah terakhir bahagian sebelumnya artikel) bukanlah satu-satunya jujukan lebar sifar khas yang tersedia untuk digunakan dalam ungkapan biasa. Dua yang paling popular ialah "karet" ^- "permulaan baris" dan tanda dolar $- "akhir baris". Memasukkan salah satu daripada ini dalam ungkapan biasa anda bermakna bahawa padanan mesti muncul pada permulaan atau penghujung rentetan sumber:
corak: ^start|end$ 
string:   mula akhir mula akhir mula akhir mula akhir 
perlawanan: ^^^^^ ^^^  
( Contoh ) Jika rentetan anda mengandungi pemisah baris, ia ^startakan sepadan dengan jujukan "mula" pada permulaan mana-mana baris dan end$akan sepadan dengan jujukan "akhir" pada penghujung mana-mana baris (walaupun ini sukar untuk ditunjukkan di sini). Simbol ini amat berguna apabila bekerja dengan data yang mengandungi pembatas. Mari kita kembali kepada isu "saiz fail" dari langkah 9 menggunakan ^"permulaan baris". Dalam contoh ini, saiz fail kami dipisahkan oleh ruang " ". Jadi kami mahu setiap saiz fail bermula dengan nombor, didahului oleh aksara ruang atau permulaan baris:
corak: (^| )(\d+|\d+\.\d+)[KMGT]B 
rentetan:   6.6KB 1..3KB 12KB 5G 3.3MB KB .6.2TB 9MB .
perlawanan: ^^^^^ ^^^^^ ^^^^^^ ^^^^ 
kumpulan:    222 122 1222 12    
( Contoh ) Kami sudah begitu hampir dengan matlamat! Tetapi anda mungkin perasan bahawa kami masih mempunyai satu masalah kecil: kami memadankan aksara ruang sebelum saiz fail yang sah. Kini kita boleh mengabaikan kumpulan penangkap ini (1) apabila enjin ekspresi biasa kita menemuinya, atau kita boleh menggunakan kumpulan bukan penangkapan, yang akan kita lihat dalam langkah seterusnya.

Sementara itu, mari selesaikan 2 lagi masalah untuk nada:

Meneruskan contoh penyerlahan sintaks kami dari langkah terakhir, beberapa penyerlahan sintaks akan menandakan ruang belakang, iaitu, sebarang ruang yang terdapat di antara aksara bukan ruang putih dan penghujung baris. Bolehkah anda menulis regex untuk menyerlahkan hanya ruang belakang?
corak:
rentetan: myvec <- c(1, 2, 3, 4, 5)  
perlawanan:                          ^^^^^^  
( Penyelesaian ) Penghurai nilai dipisahkan koma (CSV) ringkas akan mencari "token" yang dipisahkan dengan koma. Secara amnya, ruang tidak mempunyai makna melainkan ia disertakan dalam tanda petikan "". Tulis ungkapan biasa penghuraian CSV ringkas yang sepadan dengan token antara koma, tetapi mengabaikan (tidak menangkap) ruang putih yang bukan di antara petikan.
corak:
rentetan:   a, "b", "c d",e,f, "g h", dfgi,, k, "", l 
padanan: ^^ ^^^^ ^^^^^^^^^^ ^^^ ^^^ ^^^^^^ ^^ ^^^ ^ 
kumpulan:    21 2221 2222212121 222221 222211 21 221 2    
( Penyelesaian ) RegEx: 20 langkah pendek untuk menguasai ungkapan biasa. Bahagian 4.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION