Saya ingin dapat menemukan kecocokan antara huruf pertama dari sebuah kata, dan salah satu huruf dalam grup seperti "ABC". Dalam pseudocode, ini mungkin terlihat seperti:
case Process(word) =>
word.firstLetter match {
case([a-c][A-C]) =>
case _ =>
}
}
Tapi bagaimana cara mengambil huruf pertama di Scala, bukan di Jawa? Bagaimana cara mengekspresikan ekspresi reguler dengan benar? Apakah mungkin untuk melakukan ini dalam kelas kasus ?
[a-cA-C]
untuk ekspresi reguler itu.Traversable
(sepertiList
danArray
), jika Anda menginginkan 3 karakter pertama, coba"my string".take(3)
, untuk yang pertama"foo".head
Jawaban:
Anda dapat melakukan ini karena ekspresi reguler menentukan extractors tetapi Anda harus menentukan pola regex terlebih dahulu. Saya tidak memiliki akses ke Scala REPL untuk menguji ini, tetapi sesuatu seperti ini harus bekerja.
sumber
val Pattern = "[a-cA-C]".r
tidak akan berfungsi. Ini karena penggunaan case-matchunapplySeq(target: Any): Option[List[String]]
, yang mengembalikan grup yang cocok.val r = "[A-Ca-c]".r ; 'a' match { case r() => }
. scala-lang.org/api/current/#scala.util.matching.Regexval r = "([A-Ca-c])".r ; "C" match { case r(_*) => }
.Sejak versi 2.10, seseorang dapat menggunakan fitur interpolasi string Scala:
Bahkan yang lebih baik dapat mengikat grup ekspresi reguler:
Dimungkinkan juga untuk mengatur mekanisme pengikatan yang lebih rinci:
Contoh yang mengesankan tentang apa yang mungkin dengan
Dynamic
ditampilkan di posting blog Pengantar Jenis Dinamis :sumber
$
tanda sebagai pola garis akhir: kompiler mengeluh tentang kurangnya terminasi string.case p.firstName.lastName.Map(...
pola itu — bagaimana saya bisa membacanya?Regex
pembuatan prototipe cepat, tetapi perhatikan bahwa ini menciptakan contoh baru setiap kali pertandingan diperiksa. Dan itu adalah operasi yang cukup mahal yang melibatkan kompilasi dari pola regex.Seperti yang ditunjukkan delnan,
match
kata kunci dalam Scala tidak ada hubungannya dengan regex. Untuk mengetahui apakah string cocok dengan regex, Anda dapat menggunakanString.matches
metode ini. Untuk mengetahui apakah string dimulai dengan a, b atau c dalam huruf kecil atau besar, regex akan terlihat seperti ini:Anda dapat membaca regex ini sebagai "salah satu karakter a, b, c, A, B atau C diikuti oleh apa pun" (
.
berarti "karakter apa saja" dan*
berarti "nol atau lebih banyak kali", jadi ". *" Adalah string apa pun) .sumber
Untuk sedikit memperluas jawaban Andrew : Fakta bahwa ekspresi reguler menentukan ekstraktor dapat digunakan untuk menguraikan substring yang dicocokkan oleh regex dengan sangat baik menggunakan pencocokan pola Scala, misalnya:
sumber
[]
), tanda sisipan menunjukkan negasi, jadi[^\s]
berarti 'non-spasi putih'.String.matches adalah cara untuk melakukan pencocokan pola dalam arti regex.
Tetapi sebagai tambahan samping, word.firstLetter dalam kode Scala nyata terlihat seperti:
Scala memperlakukan Strings sebagai urutan Char's, jadi jika karena alasan tertentu Anda ingin secara eksplisit mendapatkan karakter pertama dari String dan mencocokkannya, Anda dapat menggunakan sesuatu seperti ini:
Saya tidak mengusulkan ini sebagai cara umum untuk melakukan pencocokan pola regex, tapi itu sejalan dengan pendekatan yang Anda usulkan untuk pertama kali menemukan karakter pertama dari String dan kemudian mencocokkannya dengan regex.
EDIT: Agar lebih jelas, cara saya akan melakukan ini adalah, seperti yang orang lain katakan:
Hanya ingin menunjukkan contoh sedekat mungkin dengan pseudocode awal Anda. Bersulang!
sumber
"Cat"(0).toString
bisa ditulis lebih jelas sebagai"Cat" take 1
, imho.val r = "[A-Ca-c]".r ; "cat"(0) match { case r() => }
,.Perhatikan bahwa pendekatan dari jawaban @ AndrewMyers cocok dengan seluruh string ke ekspresi reguler, dengan efek jangkar ekspresi reguler di kedua ujung string menggunakan
^
dan$
. Contoh:Dan tanpa
.*
akhir:sumber
val MY_RE2 = "(foo|bar)".r.unanchored ; "foo123" match { case MY_RE2(_*) => }
,. Lebih idiomatis,val re
tanpa topi.Pertama-tama kita harus tahu bahwa ekspresi reguler dapat digunakan secara terpisah. Berikut ini sebuah contoh:
Kedua kita harus memperhatikan bahwa menggabungkan ekspresi reguler dengan pencocokan pola akan sangat kuat. Ini adalah contoh sederhana.
Bahkan, ekspresi reguler itu sendiri sudah sangat kuat; satu-satunya hal yang perlu kita lakukan adalah membuatnya lebih kuat oleh Scala. Berikut adalah lebih banyak contoh dalam Dokumen Scala: http://www.scala-lang.org/files/archive/api/current/index.html#scala.util.matching.Regex
sumber