JavaRush /Java Blog /Random-ID /RegEx: 20 langkah singkat untuk menguasai ekspresi regule...
Artur
Level 40
Tallinn

RegEx: 20 langkah singkat untuk menguasai ekspresi reguler. Bagian 3

Dipublikasikan di grup Random-ID
RegEx: 20 langkah singkat untuk menguasai ekspresi reguler. Bagian 1. RegEx: 20 langkah singkat untuk menguasai ekspresi reguler. Bagian 2: Pada bagian ini kita akan beralih ke hal-hal yang sedikit lebih kompleks. Namun menguasainya, seperti sebelumnya, tidak akan sulit. Saya ulangi bahwa RegEx sebenarnya lebih mudah daripada yang terlihat pada awalnya, dan Anda tidak perlu menjadi ilmuwan hebat untuk menguasainya dan mulai menggunakannya dalam praktik. Artikel asli berbahasa Inggris ini ada di sini . 20 langkah singkat untuk menguasai ekspresi reguler.  Bagian 3 - 1

Langkah 11: Tanda kurung ()sebagai Kelompok Penangkap

20 langkah singkat untuk menguasai ekspresi reguler.  Bagian 3 - 2Pada soal terakhir, kita mencari berbagai jenis nilai integer dan nilai numerik floating point (titik). Namun mesin ekspresi reguler tidak membedakan kedua jenis nilai ini, karena semuanya ditangkap dalam satu ekspresi reguler besar. Kita dapat memberitahu mesin ekspresi reguler untuk membedakan berbagai jenis kecocokan jika kita menyertakan pola mini dalam tanda kurung:
pola: ([AZ])|([az]) 
string:   Presiden Bolivia saat ini adalah Evo Morales .
pertandingan: ^^^ ^^^^^^^ ^^^^^^^^^ ^^ ^^^^^^^ ^^ ^^^ ^^^^^^^ 
grup:    122 2222222 122222222 22 1222222 22 122 1222222  
( Contoh ) Ekspresi reguler di atas mendefinisikan dua grup tangkapan yang diindeks mulai dari 1. Grup tangkapan pertama cocok dengan satu huruf besar, dan grup tangkapan kedua cocok dengan satu huruf kecil. Dengan menggunakan tanda 'atau' |dan tanda kurung ()sebagai grup penangkap, kita dapat mendefinisikan satu ekspresi reguler yang cocok dengan beberapa jenis string. Jika kita menerapkan ini pada regex pencarian long/float dari bagian artikel sebelumnya, maka mesin regex akan menangkap kecocokan yang sesuai di grup yang sesuai. Dengan memeriksa grup mana yang cocok dengan substring, kita dapat segera menentukan apakah itu nilai float atau nilai panjang:
pola: (\d*\.\d+[fF]|\d+\.\d*[fF]|\d+[fF])|(\d+[lL]) 
string:   42L 12 x 3.4f 6l 3.3 0F LF .2F 0.
pertandingan: ^^^ ^^^^ ^^ ^^ ^^^ 
grup:    222 1111 22 11 111  
( Contoh ) Ekspresi reguler ini cukup rumit, dan untuk memahaminya dengan lebih baik, mari kita uraikan dan lihat masing-masing pola berikut:
( // cocok dengan substring "float" mana pun
  \d*\.\d+[fF]
  |
  \d+\.\d*[fF]
  |
  \d+[fF]
)
| //ATAU
( // cocok dengan substring "panjang" mana pun
  \d+[ll]
)
Grup tanda |dan penangkap dalam tanda kurung ()memungkinkan kita mencocokkan berbagai jenis substring. Dalam hal ini, kita mencocokkan bilangan floating point "float" atau bilangan bulat panjang "long".
(
  \d*\.\d+[fF] // 1+ digit di sebelah kanan koma desimal
  |
  \d+\.\d*[fF] // 1+ digit di sebelah kiri koma desimal
  |
  \d+[fF] // tanpa titik, hanya 1+ digit
)
|
(
  \d+[lL] // tanpa titik, hanya 1+ digit
)
Dalam grup pengambilan "float", kita memiliki tiga opsi: angka dengan minimal 1 digit di sebelah kanan koma desimal, angka dengan minimal 1 digit di sebelah kiri koma desimal, dan angka tanpa koma desimal. Salah satu dari mereka adalah "mengambang" asalkan ada huruf "f" atau "F" yang ditambahkan di akhir. Di dalam grup pengambilan "panjang" kita hanya memiliki satu pilihan - kita harus memiliki 1 digit atau lebih yang diikuti dengan karakter "l" atau "L". Mesin ekspresi reguler akan mencari substring ini dalam string tertentu dan mengindeksnya ke dalam grup tangkapan yang sesuai. catatanbahwa kita tidak mencocokkan angka apa pun yang tidak ditambahkan "l", "L", "f", atau "F". Bagaimana seharusnya angka-angka ini diklasifikasikan? Nah, jika mereka memiliki koma desimal, bahasa Java defaultnya adalah "ganda". Kalau tidak, mereka harus "int".

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

Tambahkan dua grup tangkapan lagi ke regex di atas sehingga juga mengklasifikasikan angka double atau int. (Ini adalah pertanyaan rumit lainnya, jangan berkecil hati jika memerlukan waktu, sebagai upaya terakhir, lihat solusi saya.)
pola:
string:   42L 12 x 3.4f 6l 3.3 0F LF .2F 0. 
cocok: ^^^ ^^ ^^^^ ^^ ^^^ ^^ ^^^ ^^ 
grup:    333 44 1111 33 222 11 111 22
( Solusi ) Masalah berikutnya sedikit lebih sederhana. Gunakan grup keterangan dalam tanda kurung (), tanda 'atau', |dan rentang karakter untuk mengurutkan usia berikut: "legal untuk minum di AS". (>= 21) dan "tidak diperbolehkan minum di AS" (<21):
pola:
string:   7 10 17 18 19 20 21 22 23 24 30 40 100 120 
kecocokan: ^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ 
grup:    2 22 22 22 22 22 11 11 11 11 11 11 111 111 
( Solusi )

Langkah 12: Identifikasi Kecocokan yang Lebih Spesifik Terlebih Dahulu

20 langkah singkat untuk menguasai ekspresi reguler.  Bagian 3 - 3Anda mungkin mengalami kesulitan dengan tugas terakhir jika Anda mencoba mendefinisikan "peminum legal" sebagai kelompok tangkapan pertama, bukan kelompok tangkapan kedua. Untuk memahami alasannya, mari kita lihat contoh lainnya. Misalkan kita ingin mencatat secara terpisah nama keluarga yang mengandung kurang dari 4 karakter dan nama keluarga yang mengandung 4 karakter atau lebih. Mari beri nama yang lebih pendek pada grup tangkapan pertama dan lihat apa yang terjadi:
pola: ([AZ][az]?[az]?)|([AZ][az][az][az]+) 
string:   Kim Job s Xu Clo yd Moh r Ngo Roc k.
pertandingan: ^^^ ^^^ ^^ ^^^ ^^^ ^^^ ^^^ 
grup:    111 111 11 111 111 111 111   
( Contoh ) Secara default, sebagian besar mesin ekspresi reguler menggunakan pencocokan serakah terhadap karakter dasar yang telah kita lihat sejauh ini. Artinya mesin ekspresi reguler akan menangkap grup terpanjang yang ditentukan sedini mungkin dalam ekspresi reguler yang disediakan. Jadi meskipun grup kedua di atas dapat menangkap lebih banyak karakter dalam nama seperti "Jobs" dan "Cloyd" misalnya, namun karena tiga karakter pertama dari nama tersebut sudah ditangkap oleh grup tangkapan pertama, maka grup tersebut tidak dapat ditangkap lagi oleh grup tangkapan kedua. . Sekarang mari kita melakukan sedikit koreksi - cukup ubah urutan grup pengambilan, tempatkan grup yang lebih spesifik (lebih panjang) terlebih dahulu:
pola: ([AZ][az][az][az]+)|([AZ][az]?[az]?) 
string:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
pertandingan: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
grup:    222 1111 22 11111 1111 222 1111    
( Contoh )

Tugas... kali ini hanya satu :)

Pola yang "lebih spesifik" hampir selalu berarti "lebih panjang". Katakanlah kita ingin mencari dua jenis "kata": pertama kata yang dimulai dengan huruf vokal (lebih spesifik), lalu kata yang tidak dimulai dengan huruf vokal (kata lainnya). Cobalah menulis ekspresi reguler untuk menangkap dan mengidentifikasi string yang cocok dengan kedua kelompok ini. (Kelompok di bawah ini diberi huruf dan bukan diberi nomor. Anda harus menentukan kelompok mana yang sesuai dengan kelompok pertama dan mana yang sesuai dengan kelompok kedua.)
pola:
string:   pds6f uub 24r2gp ewqrty l ui_op 
cocok: ^^^^^ ^^^ ^^^^^^ ^^^^^^ ^ ^^^^^ 
grup:    NNNNN VVV NNNNNN VVVVVV N VVVVV
( Solusi ) Secara umum, semakin tepat ekspresi reguler Anda, semakin lama hasilnya. Dan semakin akurat, semakin kecil kemungkinan Anda menangkap sesuatu yang tidak diperlukan. Jadi meskipun terlihat menakutkan, regex yang lebih panjang ~= regex yang lebih baik. Sayangnya .

Langkah 13: Kurung kurawal {}untuk jumlah pengulangan tertentu

20 langkah singkat untuk menguasai ekspresi reguler.  Bagian 3 - 4Dalam contoh nama belakang dari langkah sebelumnya, kita memiliki 2 grup yang hampir berulang dalam satu pola:
pola: ([AZ][az][az][az]+)|([AZ][az]?[az]?) 
string:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
pertandingan: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
grup:    222 1111 22 11111 1111 222 1111    
Untuk kelompok pertama, kami membutuhkan nama belakang dengan empat huruf atau lebih. Kelompok kedua harus mencatat nama keluarga dengan tiga huruf atau kurang. Adakah cara yang lebih mudah untuk menulis ini selain mengulangi [a-z]kelompok ini berulang kali? Ada jika Anda menggunakan kurung kurawal untuk ini {}. Kurung kurawal {}memungkinkan kita menentukan jumlah kecocokan minimum dan (opsional) maksimum dari karakter sebelumnya atau grup tangkapan. Ada tiga kasus penggunaan {}:
{X} // sama persis dengan X kali
{X,} // cocok >= X kali
{X,Y} // cocok dengan >= X dan <= Y kali
Berikut adalah contoh dari tiga sintaks yang berbeda:
pola: [az]{11} 
string:   humuhumunuk unukuapua'a.
cocok: ^^^^^^^^^^^   
( Contoh )
pola: [az]{18,} 
string:   humuhumunukunukuapua 'a.
cocok: ^^^^^^^^^^^^^^^^^^^^    
( Contoh )
pola: [az]{11,18} 
string:   humuhumunukunukuap ua'a.
cocok: ^^^^^^^^^^^^^^^^^    
( Contoh ) Ada beberapa hal yang perlu diperhatikan dalam contoh di atas.catatan:. Pertama, dengan menggunakan notasi {X}, karakter atau grup sebelumnya akan sama persis dengan angka (X) tersebut. Jika ada lebih banyak karakter dalam "kata" (daripada angka X) yang dapat cocok dengan pola (seperti yang ditunjukkan pada contoh pertama), maka karakter tersebut tidak akan disertakan dalam pencocokan. Jika jumlah karakter kurang dari X, maka pencocokan penuh akan gagal (coba ubah 11 menjadi 99 pada contoh pertama). Kedua, notasi {X,} dan {X,Y} bersifat serakah. Mereka akan mencoba mencocokkan karakter sebanyak mungkin sambil tetap memenuhi ekspresi reguler yang diberikan. Jika Anda menentukan {3,7} maka 3 hingga 7 karakter dapat dicocokkan dan jika 7 karakter berikutnya valid maka ketujuh karakter tersebut akan dicocokkan. Jika Anda menentukan {1,} dan 14.000 karakter berikutnya cocok, maka 14.000 karakter tersebut akan disertakan dalam string yang sesuai. Bagaimana kita dapat menggunakan pengetahuan ini untuk menulis ulang ekspresi kita di atas? Perbaikan paling sederhana mungkin dengan mengganti grup tetangga [a-z]dengan [a-z]{N}, dimana N dipilih sesuai:
pola: ([AZ][az]{2}[az]+)|([AZ][az]?[az]?)  
...tapi itu tidak membuat segalanya menjadi lebih baik. Lihatlah grup pengambilan pertama: kita memiliki [a-z]{2}(yang cocok dengan tepat 2 huruf kecil) diikuti oleh [a-z]+(yang cocok dengan 1 atau lebih huruf kecil). Kita dapat menyederhanakannya dengan meminta 3 huruf kecil atau lebih menggunakan kurung kurawal:
pola: ([AZ][az]{3,})|([AZ][az]?[az]?) 
Kelompok penangkap kedua berbeda. Kita memerlukan tidak lebih dari tiga karakter dalam nama belakang ini, yang berarti kita mempunyai batas atas, namun batas bawah kita adalah nol:
pola: ([AZ][az]{3,})|([AZ][az]{0,2}) 
Kekhususan selalu lebih baik ketika menggunakan ekspresi reguler, jadi sebaiknya berhenti di situ, tapi mau tak mau saya memperhatikan bahwa dua rentang karakter ( [AZ]dan [az]) yang bersebelahan ini terlihat hampir seperti kelas "karakter kata", \w( [A-Za-z0-9_]) . Jika kami yakin bahwa data kami hanya berisi nama belakang yang diformat dengan baik, maka kami dapat menyederhanakan ekspresi reguler dan menulis secara sederhana:
pola: (\w{4,})|(\w{1,3}) 
Kelompok pertama menangkap urutan 4 atau lebih "karakter kata" ( [A-Za-z0-9_]), dan kelompok kedua menangkap urutan 1 hingga 3 "karakter kata" (inklusif). Akankah ini berhasil?
pola: (\w{4,})|(\w{1,3}) 
string:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
pertandingan: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
grup:    222 1111 22 11111 1111 222 1111    
( Contoh ) Berhasil! Bagaimana dengan pendekatan ini? Dan ini jauh lebih bersih dari contoh kita sebelumnya. Karena grup tangkapan pertama mencocokkan semua nama keluarga dengan empat karakter atau lebih, kita bahkan dapat mengubah grup tangkapan kedua menjadi \w+, karena ini akan memungkinkan kita menangkap semua nama keluarga yang tersisa (dengan 1, 2, atau 3 karakter):
pola: (\w{4,})|(\w+) 
string:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
pertandingan: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
grup:    222 1111 22 11111 1111 222 1111    
( Contoh )

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

Gunakan kurung kurawal {}untuk menulis ulang ekspresi reguler pencarian nomor jaminan sosial dari langkah 7:
pola:
tali: 113-25=1902 182-82-0192 H23-_3-9982 1I1-O0-E38B
cocok:              ^^^^^^^^^^^
( Solusi ) Asumsikan bahwa pemeriksa kekuatan kata sandi situs web memerlukan kata sandi pengguna antara 6 dan 12 karakter. Tulis ekspresi reguler yang menandai kata sandi yang tidak valid dalam daftar di bawah. Setiap kata sandi terdapat dalam tanda kurung ()agar mudah dicocokkan, jadi pastikan ekspresi reguler dimulai dan diakhiri dengan karakter literal (dan simbolis. )Petunjuk: pastikan Anda tidak mengizinkan tanda kurung literal dalam kata sandi dengan [^()]atau serupa, jika tidak, Anda akan mencocokkan seluruh string!
pola:
string:   (12345) (kata sandi saya) (Xanadu.2112) (su_do) (OfSalesmen!)
cocok: ^^^^^^^ ^^^^^^^^^^^^ ^^^^^^^  
( Solusi )

Langkah 14: \bSimbol Batas Lebar Nol

20 langkah singkat untuk menguasai ekspresi reguler.  Bagian 3 - 5Tugas terakhir ini cukup sulit. Namun bagaimana jika kita membuatnya sedikit lebih rumit dengan menyertakan kata sandi dalam tanda kutip, ""bukan tanda kurung ()? Bisakah kita menulis solusi serupa hanya dengan mengganti semua karakter tanda kurung dengan karakter kutipan?
pola: \"[^"]{0.5}\"|\"[^"]+\s[^"]*\" 
string:   "12345" "kata sandi saya" "Xanadu.2112 " " su_do" " OfSalesmen! "
cocok: ^^^^^^^ ^^^^^^^^^^^^ ^^^ ^^^  
( Contoh ) Ternyata hasilnya tidak terlalu mengesankan. Apakah Anda sudah menebak alasannya? Masalahnya adalah kami mencari kata sandi yang salah di sini. "Xanadu.2112" adalah kata sandi yang bagus, jadi ketika regex menyadari bahwa urutan ini tidak mengandung spasi atau karakter literal ", ia akan menghasilkan tepat sebelum karakter "yang memenuhi syarat kata sandi di sisi kanan. (Karena kami menetapkan bahwa karakter "tidak dapat ditemukan di dalam kata sandi menggunakan [^"].) Setelah mesin ekspresi reguler yakin bahwa karakter tersebut tidak cocok dengan ekspresi reguler tertentu, mesin akan berjalan lagi, persis di tempat terakhirnya - di mana karakter tersebut berada ". yang membatasi " Xanadu.2112" di sebelah kanan. Dari sana dia melihat satu karakter spasi, dan karakter lainnya "- baginya ini adalah kata sandi yang salah! Pada dasarnya, dia menemukan urutan ini " "dan melanjutkan. Ini sama sekali bukan apa yang ingin kita dapatkan... Alangkah baiknya jika kita dapat menentukan bahwa karakter pertama kata sandi tidak boleh berupa spasi. Apakah ada cara untuk melakukan ini? (Sekarang, Anda mungkin menyadari bahwa jawaban atas semua pertanyaan retoris saya adalah "ya.") Ya! Ada cara seperti itu! Banyak mesin ekspresi reguler menyediakan urutan escape seperti "batas kata" \b. "Batas kata" \badalah rangkaian escape dengan lebar nol yang, anehnya, cocok dengan batas kata. Ingatlah bahwa saat kami mengucapkan "kata", yang kami maksud adalah rangkaian karakter apa pun di kelas \watau [A-Za-z0-9_]. Kecocokan batas kata berarti bahwa karakter tepat sebelum atau segera setelah urutan \bharus berupa неkarakter kata. Namun, saat mencocokkan, kami tidak menyertakan karakter ini dalam substring yang kami ambil. Ini adalah lebar nol. Untuk melihat cara kerjanya, mari kita lihat contoh kecil:
pola: \b[^ ]+\b 
string:   Kami masih menginginkan uang , Lebowski .
cocok: ^^ ^^^^^ ^^^^ ^^ ^^^^^ ^^^^^^^^  
( Contoh ) Urutannya [^ ]harus cocok dengan karakter apa pun yang bukan karakter spasi literal. Jadi mengapa ini tidak cocok dengan koma ,setelah uang atau titik " .setelah Lebowski? Hal ini karena koma ,dan titik .bukanlah karakter kata, sehingga dibuat batas antara karakter kata dan karakter non-kata. Mereka muncul di antara yakhir kata kata uang dan koma ,yang mengikutinya, dan di antara " ikata Lebowski dan titik .(tanda titik/titik) yang mengikutinya. Ekspresi reguler cocok dengan batasan kata-kata ini (tetapi tidak pada karakter non-kata yang hanya membantu mendefinisikannya). Namun apa jadinya jika kita tidak menyertakan konsistensi \bdalam template kita?
pola: [^ ]+ 
string:   Masih ingin mendapatkan uang, Lebowski. 
pertandingan: ^^ ^^^^^ ^^^^ ^^ ^^^^^^ ^^^^^^^^^  
( Contoh ) Ya, sekarang kita menemukan tanda baca ini juga. Sekarang mari kita gunakan batasan kata untuk memperbaiki regex untuk kata sandi yang dikutip:
pola: \"\b[^"]{0.5}\b\"|\"\b[^"]+\s[^"]*\b\" 
string:   "12345" "kata sandi saya" " Xanadu. 2112" "su_do" "Dari Penjual!"
cocok: ^^^^^^^ ^^^^^^^^^^^^ ^^^^^^^  
( Contoh ) Dengan menempatkan batas kata di dalam tanda kutip ("\b ... \b"), kita secara efektif mengatakan bahwa karakter pertama dan terakhir dari kata sandi yang cocok harus berupa "karakter kata". Jadi ini berfungsi dengan baik di sini, tetapi tidak akan berfungsi dengan baik jika karakter pertama atau terakhir dari kata sandi pengguna bukan karakter kata:
pola: \"\b[^"]{0,5}\b\"|\"\b[^"]+\s[^"]*\b\"
string: "kata sandi berikut ini terlalu pendek" "C++"
cocok:   
( Contoh ) Lihat bagaimana kata sandi kedua tidak ditandai sebagai "tidak valid" meskipun jelas-jelas terlalu pendek. Kamu harushati-hatidengan urutan \b, karena mereka hanya mencocokkan batas antar karakter \wdan tidak \w. Dalam contoh di atas, karena kita mengizinkan karakter not , dalam passwords \w, batas antara \dan karakter pertama/terakhir kata sandi tidak dijamin menjadi batas kata \b.

Untuk menyelesaikan langkah ini, kita hanya akan menyelesaikan satu masalah sederhana:

Batasan kata berguna dalam mesin penyorotan sintaksis ketika kita ingin mencocokkan rangkaian karakter tertentu, namun ingin memastikan bahwa karakter tersebut hanya muncul di awal atau akhir kata (atau sendiri-sendiri). Katakanlah kita sedang menulis penyorotan sintaksis dan ingin menyorot kata var, tetapi hanya jika kata tersebut muncul sendiri (tanpa menyentuh karakter lain dalam kata tersebut). Bisakah Anda menulis ekspresi reguler untuk ini? Tentu saja bisa, ini tugas yang sangat sederhana ;)
pola:
string:   var varx _var ( var j) barvarcar * var var -> { var }
cocok: ^^^ ^^^ ^^^ ^^^ ^^^  
( Solusi )

Langkah 15: "tanda sisipan" ^sebagai "awal garis" dan tanda dolar $sebagai "akhir garis"

20 langkah singkat untuk menguasai ekspresi reguler.  Bagian 3 - 6Urutan batas kata \b(dari langkah terakhir bagian artikel sebelumnya) bukan satu-satunya urutan lebar nol khusus yang tersedia untuk digunakan dalam ekspresi reguler. Dua yang paling populer adalah "tanda sisipan" ^- "awal garis" dan tanda dolar $- "akhir garis". Menyertakan salah satu dari ekspresi reguler ini berarti bahwa kecocokan harus muncul di awal atau akhir string sumber:
pola: ^mulai|akhir$ 
string:   awal akhir awal akhir awal akhir awal akhir 
cocok: ^^^^^ ^^^  
( Contoh ) Jika string Anda berisi jeda baris, string tersebut ^startakan cocok dengan urutan "mulai" di awal baris mana pun, dan end$akan cocok dengan urutan "akhir" di akhir baris mana pun (meskipun hal ini sulit ditampilkan di sini). Simbol-simbol ini sangat berguna ketika bekerja dengan data yang mengandung pembatas. Mari kita kembali ke masalah "ukuran file" dari langkah 9 menggunakan ^"awal baris". Dalam contoh ini, ukuran file kita dipisahkan dengan spasi " ". Jadi kita ingin setiap ukuran file dimulai dengan angka, didahului dengan karakter spasi atau awal baris:
pola: (^| )(\d+|\d+\.\d+)[KMGT]B 
string:   6.6KB 1..3KB 12KB 5G 3.3MB KB .6.2TB 9MB .
pertandingan: ^^^^^ ^^^^^ ^^^^^^ ^^^^ 
grup:    222 122 1222 12    
( Contoh ) Kita sudah sangat dekat dengan tujuan! Namun Anda mungkin memperhatikan bahwa kami masih memiliki satu masalah kecil: kami mencocokkan karakter spasi sebelum ukuran file yang valid. Sekarang kita bisa mengabaikan grup penangkap ini (1) ketika mesin ekspresi reguler kita menemukannya, atau kita bisa menggunakan grup yang tidak menangkap, yang akan kita lihat di langkah berikutnya.

Sementara itu, mari selesaikan 2 masalah lagi untuk nada:

Melanjutkan contoh penyorotan sintaksis dari langkah terakhir, beberapa penyorotan sintaksis akan menandai spasi tambahan, yaitu spasi apa pun yang berada di antara karakter non-spasi dan akhir baris. Bisakah Anda menulis ekspresi reguler untuk menyorot hanya spasi tambahan?
pola:
string: myvec <- c(1, 2, 3, 4, 5)  
cocok:                          ^^^^^^^  
( Solusi ) Pengurai nilai sederhana yang dipisahkan koma (CSV) akan mencari "token" yang dipisahkan dengan koma. Umumnya spasi tidak mempunyai arti kecuali diapit tanda petik "". Tulis ekspresi reguler penguraian CSV sederhana yang mencocokkan token di antara koma, tetapi mengabaikan (tidak menangkap) spasi yang tidak berada di antara tanda kutip.
pola:
string:   a, "b", "c d",e,f, "g h", dfgi,, k, "", l 
cocok dengan: ^^ ^^^^ ^^^^^^^^^^ ^^^ ^^^ ^^^^^^ ^^ ^^^ ^ 
grup:    21 2221 2222212121 222221 222211 21 221 2    
( Solusi ) RegEx: 20 langkah singkat untuk menguasai ekspresi reguler. Bagian 4.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION