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 2

Dipublikasikan di grup Random-ID
RegEx: 20 langkah singkat untuk menguasai ekspresi reguler. Bagian 1 Asli di sini Pada bagian terakhir kita menguasai ekspresi reguler yang paling sederhana, dan telah mempelajari sesuatu. Pada bagian ini kita akan mempelajari desain yang sedikit lebih rumit, tapi percayalah, ini tidak akan sesulit kelihatannya. RegEx: 20 langkah singkat untuk menguasai ekspresi reguler.  Bagian 2 - 1Jadi mari kita lanjutkan!

Langkah 8: *Tanda Bintang dan Tanda Tambah+

RegEx: 20 langkah singkat untuk menguasai ekspresi reguler.  Bagian 2 - 2Sejauh ini, kami kurang lebih hanya mampu mencocokkan string dengan panjang tertentu. Namun dalam soal terbaru kita telah mendekati batas dari apa yang dapat kita lakukan dengan notasi yang telah kita lihat sejauh ini. Mari kita asumsikan, misalnya, kita tidak terbatas pada pengidentifikasi Java 3 karakter, namun kita dapat memiliki pengidentifikasi dengan panjang berapa pun. Solusi yang mungkin berhasil pada contoh sebelumnya tidak akan berfungsi pada contoh berikut:
pola: [a-zA-Z_$]\w\w 
string:   __e $12 3 3,2 fo Bar r a23 mm ab x
cocok: ^^^ ^^^ ^^^ ^^^  
( Contoh ) catatanbahwa ketika suatu pengidentifikasi valid tetapi lebih panjang dari 3 karakter, hanya tiga karakter pertama yang cocok. Dan bila pengenalnya valid, tetapi berisi kurang dari 3 karakter, maka regex tidak menemukannya sama sekali! Masalahnya adalah ekspresi dalam tanda kurung []cocok dengan satu karakter, seperti halnya kelas karakter seperti \w. Artinya, setiap kecocokan dalam ekspresi reguler di atas harus terdiri dari tiga karakter. Jadi itu tidak berjalan sebaik yang kita harapkan. *Karakter khusus dan dapat membantu di sini +. Ini adalah pengubah yang dapat ditambahkan di sebelah kanan ekspresi apa pun untuk mencocokkan ekspresi tersebut lebih dari satu kali. Kleene Star (atau "tanda bintang") *akan menunjukkan bahwa token sebelumnya harus dicocokkan beberapa kali, termasuk nol kali. Tanda plus +akan menunjukkan bahwa Anda perlu mencari satu kali atau lebih. Jadi, ekspresi yang mendahuluinya +bersifat wajib (setidaknya satu kali), sedangkan ekspresi yang mendahuluinya *bersifat opsional, namun jika muncul, ekspresi tersebut dapat muncul berapa kali pun. Sekarang, dengan pengetahuan ini, kita dapat memperbaiki ekspresi reguler di atas:
pola: [a-zA-Z_$]\w* 
string:   __e $123 3,2 untuk Barr a23mm ab x 
cocok: ^^^ ^^^^ ^^ ^^^^ ^^^^^ ^^ ^ 
( Contoh ) Sekarang kita mencocokkan pengidentifikasi yang valid dengan panjang berapa pun! Bingo! +Namun apa yang akan terjadi jika kita menggunakan *?
pola: [a-zA-Z_$]\w+ 
string:   __e $123 3,2 untuk Barr a23mm ab x
cocok: ^^^ ^^^^ ^^ ^^^^ ^^^^^ ^^ 
( Contoh ) Kami melewatkan pertandingan terakhir, х. Hal ini karena memerlukan +setidaknya satu karakter untuk dicocokkan, namun karena ekspresi dalam tanda kurung []sebelumnya \w+telah 'memakan' karakter tersebut x, tidak ada lagi karakter yang tersedia, sehingga pencocokan gagal. Kapan kita bisa menggunakannya +? Saat kita perlu menemukan setidaknya satu kecocokan, namun tidak masalah berapa kali ekspresi tertentu harus cocok. Misalnya, jika kita ingin mencari bilangan apa pun yang mengandung koma desimal:
pola: \d*\.\d+ 
string:   0,011 .2 42 2.0 3.33 4.000 5 6 7.89012 
cocok: ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^  
( Contoh ) catatanbahwa dengan menjadikan angka di sebelah kiri koma desimal sebagai opsional, kita dapat menemukan 0,011 dan 0,2. Untuk melakukan ini, kita perlu mencocokkan tepat satu koma desimal dengan \.dan setidaknya satu digit di sebelah kanan koma desimal dengan \d+. Ekspresi reguler di atas tidak akan cocok dengan angka seperti 3., karena kita memerlukan setidaknya satu digit di sebelah kanan koma desimal untuk mencocokkan.

Seperti biasa, mari selesaikan beberapa masalah sederhana:

Temukan semua kata bahasa Inggris pada bagian di bawah ini.
pola:
string: 3 ditambah 3 adalah enam tetapi 4 ditambah tiga adalah 7
cocok:    ^^^^ ^^ ^^^ ^^^ ^^^^ ^^^^^ ^^ 
( Solusi ) Temukan semua simbol ukuran file dalam daftar di bawah. Ukuran file akan terdiri dari angka (dengan atau tanpa koma desimal) diikuti oleh KB, MB, GBatau TB:
pola:
string:   11TB 13 14.4MB 22HB 9.9GB TB 0KB 
cocok: ^^^^ ^^^^^^ ^^^^^ ^^^  
( Solusi )

Langkah 9: tanda tanya "opsional".?

RegEx: 20 langkah singkat untuk menguasai ekspresi reguler.  Bagian 2 - 3Apakah Anda sudah menulis regex untuk menyelesaikan masalah terakhir? Apa itu bekerja? Sekarang coba terapkan di sini:
pola:
string: 1..3KB 5...GB ..6TB
cocok:  
Jelasnya, tidak satu pun dari sebutan ini yang merupakan ukuran file yang valid, jadi ekspresi reguler yang baik tidak boleh cocok dengan keduanya. Solusi yang saya tulis untuk menyelesaikan masalah terakhir cocok dengan semuanya, setidaknya sebagian:
pola: \d+\.*\d*[KMGT]B 
string:   1..3KB  5...GB .. 6TB 
cocok: ^^^^^^ ^^^^^^ ^^^ 
( Contoh ) Lalu apa masalahnya? Faktanya, kita hanya perlu mencari satu koma desimal, jika ada. Tapi *itu mengizinkan sejumlah kecocokan, termasuk nol. Apakah ada cara untuk mencocokkan hanya nol kali atau satu kali? Tapi tidak lebih dari sekali? Tentu saja punya. "opsional" ?adalah pengubah yang cocok dengan nol atau salah satu karakter sebelumnya, tetapi tidak lebih:
pola: \d+\.?\d*[KMGT]B 
string: 1.. 3KB 5...GB .. 6TB 
cocok:     ^^^ ^^^ 
( Contoh ) Kita hampir mencapai solusi di sini, namun hal ini tidak cukup yang kita perlukan. Kita akan melihat cara memperbaikinya dalam beberapa langkah nanti.

Sementara itu, mari kita selesaikan masalah ini:

Dalam beberapa bahasa pemrograman (misalnya Java), beberapa bilangan integer dan floating point (titik) mungkin diikuti oleh l/ Ldan f/ Funtuk menunjukkan bahwa bilangan tersebut harus diperlakukan sebagai long/float (masing-masing) dan bukan sebagai int/double biasa. Temukan semua nomor "panjang" yang valid pada baris di bawah ini:
pola:
string:   13L panjang 2l 19 L lL 0 
cocok: ^^^ ^^ ^^ ^ 
( Solusi )

Langkah 10: tanda "atau".|

RegEx: 20 langkah singkat untuk menguasai ekspresi reguler.  Bagian 2 - 4Pada langkah 8, kami mengalami kesulitan menemukan berbagai jenis bilangan floating point:
pola: \d*\.\d+ 
string:   0,011 .2 42 2.0 3.33 4.000 5 6 7.89012 
cocok: ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^  
Pola di atas mencocokkan angka dengan koma desimal dan setidaknya satu digit di sebelah kanan koma desimal. Namun bagaimana jika kita juga ingin mencocokkan string seperti 0.? (Tidak ada angka di sebelah kanan koma desimal.) Kita dapat menulis ekspresi reguler seperti ini:
pola: \d*\.\d* 
string:   0,011 .2 42 2.0 3.33 4.000 5 6 7.89012 0. . 
cocok: ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^ ^^ ^ 
( Contoh ) Ini cocok 0., tetapi juga cocok dengan satu titik ., seperti yang Anda lihat di atas. Sebenarnya yang kami coba cocokkan adalah dua kelas string yang berbeda:
  1. angka dengan setidaknya satu digit di sebelah kanan koma desimal
  2. angka dengan setidaknya satu digit di sebelah kiri koma desimal
Mari kita tuliskan 2 ekspresi reguler berikut, yang independen satu sama lain:
pola: \d*\.\d+ 
string:   0,011 .2 42 2.0 3.33 4.000 5 6 7.89012 0. .
cocok: ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^  
pola: \d+\.\d* 
string:   0,011 .2 42 2.0 3.33 4.000 5 6 7.89012 0. .
pertandingan: ^^^^^ ^^^ ^^^^ ^^^^^ ^^^^^^^ ^^ 
Kita melihat bahwa tidak satu pun dari kasus ini substring 42,, 5atau ditemukan 6oleh .mesin. Untuk mendapatkan hasil yang diinginkan, tidak ada salahnya kita menggabungkan ekspresi reguler tersebut. Bagaimana kita bisa mencapai hal ini? Tanda "atau" |memungkinkan kita menentukan beberapa kemungkinan urutan kecocokan sekaligus dalam ekspresi reguler. Sama seperti []tanda "atau" yang memungkinkan kita menentukan karakter tunggal alternatif, |kita juga dapat menentukan ekspresi multi-karakter alternatif. Misalnya, jika kita ingin mencari "anjing" atau "kucing", kita dapat menulis sesuatu seperti ini:
pola: \w\w\w 
string:   Jelas sekali , seekor anjing adalah hewan peliharaan yang lebih baik daripada seekor kucing .
cocok: ^^^^^^^^^ ^^^ ^^^^^^ ^^^ ^^^ ^^^ 
( Contoh ) ... tetapi ini cocok dengan semua rangkaian tiga karakter dari kelas "kata". Tapi "anjing" dan "kucing" bahkan tidak memiliki huruf yang sama, jadi tanda kurung siku tidak akan membantu kita di sini. Inilah ekspresi reguler paling sederhana yang bisa kita gunakan yang cocok dengan kedua kata tersebut:
pola: anjing|kucing 
string: Jelas sekali, anjing adalah hewan peliharaan yang lebih baik daripada kucing .
cocok:               ^^^ ^^^ 
( Contoh ) Mesin ekspresi reguler pertama-tama mencoba mencocokkan seluruh urutan di sebelah kiri karakter |, namun jika gagal, mesin kemudian mencoba mencocokkan urutan di sebelah kanan karakter |. Beberapa karakter |juga dapat dirangkai untuk mencocokkan lebih dari dua urutan alternatif:
pola: anjing|kucing|pet 
string: Jelas sekali, anjing adalah hewan peliharaan yang lebih baik daripada kucing .
cocok:               ^^^ ^^^ ^^^ 
( Contoh )

Sekarang mari kita selesaikan beberapa masalah lain untuk lebih memahami langkah ini:

Gunakan tanda |untuk mengoreksi ekspresi reguler desimal di atas sehingga menghasilkan hasil seperti ini:
pola:
string:   0,011 .2 42 2.0 3.33 4.000 5 6 7.89012 0. .
pertandingan: ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^ ^^ 
( Solusi ) Gunakan tanda |, kelas karakter, "opsional" ?, dll. untuk membuat satu ekspresi reguler yang cocok dengan bilangan bulat dan bilangan floating point (titik), seperti yang dibahas dalam soal di akhir langkah sebelumnya (soal ini sedikit lebih rumit ya ;))
pola:
string:   42L 12 x 3.4f 6l 3.3 0F LF .2F 0. 
cocok: ^^^ ^^ ^^^^ ^^ ^^^ ^^ ^^^ ^^  
( Solusi ) 20 langkah singkat untuk menguasai ekspresi reguler. Bagian 3 RegEx: 20 langkah singkat untuk menguasai ekspresi reguler. Bagian 4
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION