Scala - Ekspresi Reguler

Bab ini menjelaskan bagaimana Scala mendukung ekspresi reguler melalui Regex kelas yang tersedia di paket scala.util.matching.

Coba program contoh berikut di mana kami akan mencoba mencari kata Scala dari sebuah pernyataan.

Contoh

import scala.util.matching.Regex

object Demo {
   def main(args: Array[String]) {
      val pattern = "Scala".r
      val str = "Scala is Scalable and cool"
      
      println(pattern findFirstIn str)
   }
}

Simpan program di atas dalam Demo.scala. Perintah berikut digunakan untuk mengkompilasi dan menjalankan program ini.

Perintah

\>scalac Demo.scala
\>scala Demo

Keluaran

Some(Scala)

Kami membuat String dan memanggil r( )metode di atasnya. Scala secara implisit mengubah String menjadi RichString dan memanggil metode tersebut untuk mendapatkan instance Regex. Untuk menemukan kecocokan pertama dari ekspresi reguler, cukup panggilfindFirstIn()metode. Jika alih-alih hanya menemukan kemunculan pertama kita ingin menemukan semua kemunculan dari kata yang cocok, kita bisa menggunakanfindAllIn( ) metode dan jika ada beberapa kata Scala yang tersedia di string target, ini akan mengembalikan kumpulan semua kata yang cocok.

Anda dapat menggunakan metode mkString () untuk menggabungkan daftar yang dihasilkan dan Anda dapat menggunakan pipa (|) untuk mencari huruf kapital dan kecil dari Scala dan Anda dapat menggunakan Regex konstruktor sebagai gantinya atau r() metode untuk membuat pola.

Coba program contoh berikut.

Contoh

import scala.util.matching.Regex

object Demo {
   def main(args: Array[String]) {
      val pattern = new Regex("(S|s)cala")
      val str = "Scala is scalable and cool"
      
      println((pattern findAllIn str).mkString(","))
   }
}

Simpan program di atas dalam Demo.scala. Perintah berikut digunakan untuk mengkompilasi dan menjalankan program ini.

Perintah

\>scalac Demo.scala
\>scala Demo

Keluaran

Scala,scala

Jika Anda ingin mengganti teks yang cocok, kami dapat menggunakan replaceFirstIn( ) untuk menggantikan pertandingan pertama atau replaceAllIn( ) untuk mengganti semua kejadian.

Contoh

object Demo {
   def main(args: Array[String]) {
      val pattern = "(S|s)cala".r
      val str = "Scala is scalable and cool"
      
      println(pattern replaceFirstIn(str, "Java"))
   }
}

Simpan program di atas dalam Demo.scala. Perintah berikut digunakan untuk mengkompilasi dan menjalankan program ini.

Perintah

\>scalac Demo.scala
\>scala Demo

Keluaran

Java is scalable and cool

Membentuk Ekspresi Reguler

Scala mewarisi sintaks ekspresi regulernya dari Java, yang pada gilirannya mewarisi sebagian besar fitur Perl. Berikut beberapa contoh yang seharusnya cukup sebagai penyegar -

Berikut adalah tabel daftar semua ekspresi reguler Meta karakter sintaks yang tersedia di Jawa.

Subekspresi Cocok
^ Cocok di awal baris.
$ Pertandingan akhir baris.
. Cocok dengan salah satu karakter kecuali baris baru. Menggunakan opsi m memungkinkannya untuk mencocokkan baris baru juga.
[...] Cocok dengan salah satu karakter dalam tanda kurung.
[^ ...] Cocok dengan satu karakter apa pun yang tidak ada dalam tanda kurung
\\SEBUAH Awal dari seluruh string
\\ z Akhir dari seluruh string
\\ Z Akhir dari seluruh string kecuali terminator baris terakhir yang diizinkan.
kembali* Cocok dengan 0 atau lebih kemunculan ekspresi sebelumnya.
re + Cocok dengan 1 atau lebih dari hal sebelumnya
kembali? Cocok dengan 0 atau 1 kemunculan ekspresi sebelumnya.
kembali {n} Cocok persis dengan n jumlah kemunculan ekspresi sebelumnya.
kembali {n,} Cocok dengan n atau lebih kemunculan ekspresi sebelumnya.
kembali {n, m} Cocok setidaknya n dan paling banyak m kemunculan ekspresi sebelumnya.
a | b Cocok dengan a atau b.
(kembali) Kelompokkan ekspresi reguler dan ingat teks yang cocok.
(?: re) Kelompokkan ekspresi reguler tanpa mengingat teks yang cocok.
(?> kembali) Mencocokkan pola independen tanpa mundur.
\\ w Cocok dengan karakter kata.
\\ W Cocok dengan karakter bukan kata.
\\ s Cocok dengan spasi. Setara dengan [\ t \ n \ r \ f].
\\ S Cocok dengan nonwhitespace.
\\ d Cocok dengan angka. Setara dengan [0-9].
\\ D Cocok dengan nondigits.
\\SEBUAH Cocok dengan awal string.
\\ Z Cocok dengan ujung string. Jika ada baris baru, itu cocok sebelum baris baru.
\\ z Cocok dengan ujung string.
\\ G Mencocokkan poin di mana pertandingan terakhir selesai.
\\ n Referensi balik untuk menangkap nomor grup "n"
\\ b Mencocokkan batas kata saat berada di luar tanda kurung. Cocok dengan spasi mundur (0x08) saat berada di dalam tanda kurung.
\\ B Cocok dengan batasan bukan kata.
\\ n, \\ t, dll. Cocok dengan baris baru, carriage return, tab, dll.
\\ Q Escape (kutipan) semua karakter hingga \\ E
\\ E Mengakhiri kutipan dimulai dengan \\ Q

Contoh Ekspresi Reguler

Contoh Deskripsi
. Cocok dengan karakter apa pun kecuali baris baru
[Rr] uby Cocokkan "Ruby" atau "ruby"
gosok [kamu] Cocokkan "ruby" atau "rube"
[aeiou] Cocokkan salah satu vokal huruf kecil
[0-9] Cocok dengan angka apa pun; sama seperti [0123456789]
[az] Cocok dengan semua huruf kecil ASCII
[AZ] Cocok dengan semua huruf besar ASCII
[a-zA-Z0-9] Cocokkan salah satu dari yang di atas
[^ aeiou] Cocokkan apa pun selain vokal huruf kecil
[^ 0-9] Cocokkan apa pun selain digit
\\ d Cocokkan angka: [0-9]
\\ D Cocokkan tanpa digit: [^ 0-9]
\\ s Cocokkan karakter spasi: [\ t \ r \ n \ f]
\\ S Cocokkan bukan spasi: [^ \ t \ r \ n \ f]
\\ w Cocok dengan satu karakter kata: [A-Za-z0-9_]
\\ W Cocok dengan karakter bukan kata: [^ A-Za-z0-9_]
rubi? Cocokkan "gosok" atau "ruby": y adalah opsional
rubi* Cocokkan "gosok" ditambah 0 atau lebih ys
ruby + Cocokkan "gosok" ditambah 1 atau lebih ys
\\ d {3} Cocok persis dengan 3 digit
\\ d {3,} Cocokkan 3 digit atau lebih
\\ d {3,5} Cocokkan 3, 4, atau 5 digit
\\ D \\ d + Tidak ada grup: + berulang \\ d
(\\ D \\ d) + / Dikelompokkan: + mengulangi \\ D \ d pasangan
([Rr] uby (,)?) + Cocokkan "Ruby", "Ruby, ruby, ruby", dll.

Note- bahwa setiap garis miring terbalik muncul dua kali pada string di atas. Ini karena di Java dan Scala, satu garis miring terbalik adalah karakter pelarian dalam string literal, bukan karakter biasa yang muncul dalam string. Jadi alih-alih '\', Anda perlu menulis '\\' untuk mendapatkan satu garis miring terbalik di string.

Coba program contoh berikut.

Contoh

import scala.util.matching.Regex

object Demo {
   def main(args: Array[String]) {
      val pattern = new Regex("abl[ae]\\d+")
      val str = "ablaw is able1 and cool"
      
      println((pattern findAllIn str).mkString(","))
   }
}

Simpan program di atas dalam Demo.scala. Perintah berikut digunakan untuk mengkompilasi dan menjalankan program ini.

Perintah

\>scalac Demo.scala
\>scala Demo

Keluaran

able1