Scala - wyrażenia regularne
W tym rozdziale wyjaśniono, w jaki sposób Scala obsługuje wyrażenia regularne poprzez Regex klasa dostępna w pakiecie scala.util.matching.
Wypróbuj poniższy przykładowy program, w którym spróbujemy znaleźć słowo Scala z oświadczenia.
Przykład
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)
}
}
Zapisz powyższy program w formacie Demo.scala. Poniższe polecenia służą do kompilowania i wykonywania tego programu.
Komenda
\>scalac Demo.scala
\>scala Demo
Wynik
Some(Scala)
Tworzymy String i wywołujemy r( )metoda na nim. Scala niejawnie konwertuje String na RichString i wywołuje tę metodę, aby uzyskać wystąpienie Regex. Aby znaleźć pierwsze dopasowanie wyrażenia regularnego, po prostu wywołajfindFirstIn()metoda. Jeśli zamiast znajdować tylko pierwsze wystąpienie, chcielibyśmy znaleźć wszystkie wystąpienia pasującego słowa, możemy użyćfindAllIn( ) iw przypadku, gdy w ciągu docelowym dostępnych jest wiele słów Scala, zwróci to kolekcję wszystkich pasujących słów.
Możesz użyć metody mkString () do konkatenacji listy wynikowej i możesz użyć potoku (|) do wyszukania małych i wielkich liter w Scali i możesz użyć Regex konstruktor zamiast lub r() metoda tworzenia wzoru.
Wypróbuj następujący przykładowy program.
Przykład
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(","))
}
}
Zapisz powyższy program w formacie Demo.scala. Poniższe polecenia służą do kompilowania i wykonywania tego programu.
Komenda
\>scalac Demo.scala
\>scala Demo
Wynik
Scala,scala
Jeśli chcesz zamienić pasujący tekst, możemy użyć replaceFirstIn( ) aby zastąpić pierwszy mecz lub replaceAllIn( ) zastąpić wszystkie wystąpienia.
Przykład
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"))
}
}
Zapisz powyższy program w formacie Demo.scala. Poniższe polecenia służą do kompilowania i wykonywania tego programu.
Komenda
\>scalac Demo.scala
\>scala Demo
Wynik
Java is scalable and cool
Tworzenie wyrażeń regularnych
Scala dziedziczy składnię wyrażeń regularnych po Javie, która z kolei dziedziczy większość funkcji Perla. Oto kilka przykładów, które powinny wystarczyć jako odświeżenie -
Poniższa tabela zawiera listę wszystkich składni metaznaków wyrażeń regularnych dostępnych w języku Java.
Podwyrażenie | mecze |
---|---|
^ | Dopasowuje początek wiersza. |
$ | Pasuje do końca linii. |
. | Dopasowuje dowolny pojedynczy znak z wyjątkiem nowej linii. Użycie opcji m pozwala dopasować również znak nowej linii. |
[…] | Dopasowuje dowolny pojedynczy znak w nawiasach. |
[^ ...] | Dopasowuje dowolny pojedynczy znak nie w nawiasach |
\\ZA | Początek całego ciągu |
\\ z | Koniec całego ciągu |
\\ Z | Koniec całego ciągu z wyjątkiem dopuszczalnego końcowego terminatora wiersza. |
re* | Dopasowuje 0 lub więcej wystąpień poprzedniego wyrażenia. |
re + | Dopasowuje 1 lub więcej poprzedniej rzeczy |
re? | Dopasowuje 0 lub 1 wystąpienie poprzedniego wyrażenia. |
re {n} | Dopasowuje dokładnie n liczbę wystąpień poprzedniego wyrażenia. |
re {n,} | Dopasowuje n lub więcej wystąpień poprzedniego wyrażenia. |
re {n, m} | Dopasowuje co najmniej n i co najwyżej m wystąpień poprzedniego wyrażenia. |
a | b | Pasuje do a lub b. |
(re) | Grupuje wyrażenia regularne i zapamiętuje dopasowany tekst. |
(?: re) | Grupuje wyrażenia regularne bez zapamiętywania dopasowanego tekstu. |
(?> re) | Dopasowuje niezależny wzorzec bez cofania. |
\\ w | Dopasowuje znaki słowne. |
\\ W. | Dopasowuje znaki inne niż słowa. |
\\ s | Dopasowuje spacje. Odpowiednik [\ t \ n \ r \ f]. |
\\ S | Dopasowuje bez białych znaków. |
\\re | Dopasowuje cyfry. Odpowiednik [0-9]. |
\\RE | Dopasowuje niecyfry. |
\\ZA | Dopasowuje początek łańcucha. |
\\ Z | Dopasowuje koniec łańcucha. Jeśli istnieje nowa linia, pasuje ona tuż przed nową linią. |
\\ z | Dopasowuje koniec łańcucha. |
\\SOL | Mecze to miejsce, w którym zakończył się ostatni mecz. |
\\ n | Odniesienie wsteczne do numeru grupy przechwytywania „n” |
\\b | Dopasowuje granice wyrazów poza nawiasami. Dopasowuje znak Backspace (0x08) wewnątrz nawiasów. |
\\B | Dopasowuje granice bez słów. |
\\ n, \\ t itp. | Dopasowuje znaki nowej linii, powroty karetki, tabulatory itp. |
\\ Q | Escape (cudzysłów) wszystkimi znakami do \\ E |
\\MI | Kończy cytowanie zaczynające się od \\ Q |
Przykłady wyrażeń regularnych
Przykład | Opis |
---|---|
. | Dopasuj dowolny znak z wyjątkiem nowej linii |
[Rr] uby | Dopasuj „Ruby” lub „Ruby” |
pocierać [ye] | Dopasuj „ruby” lub „rube” |
[aeiou] | Dopasuj dowolną małą samogłoskę |
[0–9] | Dopasuj dowolną cyfrę; tak samo jak [0123456789] |
[az] | Dopasuj dowolną małą literę ASCII |
[AZ] | Dopasuj dowolną wielką literę ASCII |
[a-zA-Z0-9] | Dopasuj dowolne z powyższych |
[^ aeiou] | Dopasuj wszystko inne niż mała samogłoska |
[^ 0–9] | Dopasuj cokolwiek innego niż cyfra |
\\re | Dopasuj cyfrę: [0–9] |
\\RE | Dopasuj niecyfrę: [^ 0-9] |
\\ s | Dopasuj biały znak: [\ t \ r \ n \ f] |
\\ S | Dopasuj bez białych znaków: [^ \ t \ r \ n \ f] |
\\ w | Dopasuj pojedynczy znak słowa: [A-Za-z0-9_] |
\\ W. | Dopasuj znak niebędący słowem: [^ A-Za-z0-9_] |
rubin? | Dopasuj „rub” lub „ruby”: y jest opcjonalne |
rubin* | Dopasuj „rub” plus 0 lub więcej ys |
rubin + | Dopasuj „rub” plus 1 lub więcej lat |
\\ d {3} | Dopasuj dokładnie 3 cyfry |
\\ d {3,} | Dopasuj 3 lub więcej cyfr |
\\ d {3,5} | Dopasuj 3, 4 lub 5 cyfr |
\\ D \\ d + | Brak grupy: + powtarza \\ d |
(\\ D \\ d) + / | Zgrupowane: + powtórzenia \\ D \ d para |
([Rr] uby (,)?) + | Dopasuj „Ruby”, „Ruby, ruby, ruby” itp. |
Note- że każdy lewy ukośnik występuje dwukrotnie w powyższym ciągu. Dzieje się tak, ponieważ w Javie i Scali pojedynczy ukośnik odwrotny jest znakiem zmiany znaczenia w literale ciągu, a nie zwykłym znakiem, który pojawia się w ciągu. Więc zamiast '\', musisz napisać '\\', aby uzyskać pojedynczy lewy ukośnik w ciągu.
Wypróbuj następujący przykładowy program.
Przykład
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(","))
}
}
Zapisz powyższy program w formacie Demo.scala. Poniższe polecenia służą do kompilowania i wykonywania tego programu.
Komenda
\>scalac Demo.scala
\>scala Demo
Wynik
able1