Scala - Reguläre Ausdrücke
In diesem Kapitel wird erläutert, wie Scala reguläre Ausdrücke unterstützt Regex Klasse im Paket scala.util.matching verfügbar.
Versuchen Sie das folgende Beispielprogramm, in dem wir versuchen, das Wort herauszufinden Scala aus einer Aussage.
Beispiel
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)
}
}
Speichern Sie das obige Programm in Demo.scala. Die folgenden Befehle werden zum Kompilieren und Ausführen dieses Programms verwendet.
Befehl
\>scalac Demo.scala
\>scala Demo
Ausgabe
Some(Scala)
Wir erstellen einen String und rufen den auf r( )Methode darauf. Scala konvertiert den String implizit in einen RichString und ruft diese Methode auf, um eine Instanz von Regex abzurufen. Um eine erste Übereinstimmung des regulären Ausdrucks zu finden, rufen Sie einfach das auffindFirstIn()Methode. Wenn wir nicht nur das erste Vorkommen finden möchten, sondern alle Vorkommen des passenden Wortes finden möchten, können wir das verwendenfindAllIn( ) Methode und falls in der Zielzeichenfolge mehrere Scala-Wörter verfügbar sind, wird eine Sammlung aller übereinstimmenden Wörter zurückgegeben.
Sie können die Methode mkString () verwenden, um die resultierende Liste zu verketten, und Sie können eine Pipe (|) verwenden, um kleine und große Groß- und Kleinschreibung von Scala zu durchsuchen, und Sie können verwenden Regex Konstruktor statt oder r() Methode zum Erstellen eines Musters.
Versuchen Sie das folgende Beispielprogramm.
Beispiel
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(","))
}
}
Speichern Sie das obige Programm in Demo.scala. Die folgenden Befehle werden zum Kompilieren und Ausführen dieses Programms verwendet.
Befehl
\>scalac Demo.scala
\>scala Demo
Ausgabe
Scala,scala
Wenn Sie passenden Text ersetzen möchten, können wir verwenden replaceFirstIn( ) das erste Spiel zu ersetzen oder replaceAllIn( ) alle Vorkommen zu ersetzen.
Beispiel
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"))
}
}
Speichern Sie das obige Programm in Demo.scala. Die folgenden Befehle werden zum Kompilieren und Ausführen dieses Programms verwendet.
Befehl
\>scalac Demo.scala
\>scala Demo
Ausgabe
Java is scalable and cool
Reguläre Ausdrücke bilden
Scala erbt seine Syntax für reguläre Ausdrücke von Java, das wiederum die meisten Funktionen von Perl erbt. Hier sind nur einige Beispiele, die als Auffrischung ausreichen sollten -
In der folgenden Tabelle sind alle in Java verfügbaren Metazeichen-Syntax für reguläre Ausdrücke aufgeführt.
Unterausdruck | Streichhölzer |
---|---|
^ | Entspricht dem Zeilenanfang. |
$ | Entspricht dem Zeilenende. |
. | Entspricht einem einzelnen Zeichen außer Zeilenumbruch. Mit der Option m kann auch der Zeilenumbruch abgeglichen werden. |
[...] | Entspricht einem einzelnen Zeichen in Klammern. |
[^ ...] | Entspricht einem einzelnen Zeichen, das nicht in Klammern steht |
\\EIN | Anfang der gesamten Saite |
\\ z | Ende der gesamten Zeichenfolge |
\\ Z. | Ende der gesamten Zeichenfolge mit Ausnahme des zulässigen Abschlussabschlusses. |
Re* | Entspricht 0 oder mehr Vorkommen des vorhergehenden Ausdrucks. |
re + | Entspricht 1 oder mehr der vorherigen Sache |
Re? | Entspricht 0 oder 1 Vorkommen des vorhergehenden Ausdrucks. |
re {n} | Entspricht genau n Vorkommen des vorhergehenden Ausdrucks. |
re {n,} | Entspricht n oder mehr Vorkommen des vorhergehenden Ausdrucks. |
re {n, m} | Entspricht mindestens n und höchstens m Vorkommen des vorhergehenden Ausdrucks. |
a | b | Entspricht entweder a oder b. |
(Re) | Gruppiert reguläre Ausdrücke und merkt sich übereinstimmenden Text. |
(?: re) | Gruppiert reguläre Ausdrücke, ohne sich an übereinstimmenden Text zu erinnern. |
(?> re) | Entspricht einem unabhängigen Muster ohne Rückverfolgung. |
\\ w | Entspricht Wortzeichen. |
\\ W. | Entspricht Nichtwortzeichen. |
\\ s | Entspricht Leerzeichen. Entspricht [\ t \ n \ r \ f]. |
\\ S. | Entspricht Nicht-Leerzeichen. |
\\ d | Entspricht den Ziffern. Entspricht [0-9]. |
\\ D. | Entspricht nicht-stelligen. |
\\EIN | Entspricht dem Zeichenfolgenanfang. |
\\ Z. | Entspricht dem Ende der Zeichenfolge. Wenn eine neue Zeile vorhanden ist, stimmt sie kurz vor der neuen Zeile überein. |
\\ z | Entspricht dem Ende der Zeichenfolge. |
\\G | Spielpunkt, an dem das letzte Spiel beendet wurde. |
\\ n | Rückverweis auf Erfassungsgruppennummer "n" |
\\ b | Entspricht den Wortgrenzen außerhalb der Klammern. Entspricht der Rücktaste (0x08) in Klammern. |
\\ B. | Entspricht den Nichtwortgrenzen. |
\\ n, \\ t usw. | Entspricht Zeilenumbrüchen, Wagenrückläufen, Tabulatoren usw. |
\\ Q. | Escape (Zitat) alle Zeichen bis zu \\ E. |
\\ E. | Beendet das mit \\ Q begonnene Zitat |
Beispiele für reguläre Ausdrücke
Beispiel | Beschreibung |
---|---|
. | Entspricht einem beliebigen Zeichen außer Newline |
[Rr] uby | Match "Ruby" oder "Ruby" |
reibe [ihr] | Match "Rubin" oder "Rube" |
[aeiou] | Passen Sie einen beliebigen Kleinbuchstaben an |
[0-9] | Entspricht einer beliebigen Ziffer. das gleiche wie [0123456789] |
[az] | Passen Sie einen beliebigen ASCII-Kleinbuchstaben an |
[AZ] | Passen Sie einen beliebigen ASCII-Großbuchstaben an |
[a-zA-Z0-9] | Passen Sie zu einem der oben genannten Punkte |
[^ aeiou] | Passen Sie etwas anderes als einen Kleinbuchstaben an |
[^ 0-9] | Ordnen Sie etwas anderes als eine Ziffer zu |
\\ d | Entspricht einer Ziffer: [0-9] |
\\ D. | Entspricht einer nichtstelligen Zahl: [^ 0-9] |
\\ s | Entspricht einem Leerzeichen: [\ t \ r \ n \ f] |
\\ S. | Nicht-Leerzeichen abgleichen: [^ \ t \ r \ n \ f] |
\\ w | Entspricht einem einzelnen Wortzeichen: [A-Za-z0-9_] |
\\ W. | Entspricht einem Nichtwortzeichen: [^ A-Za-z0-9_] |
Rubin? | Match "rub" oder "ruby": das y ist optional |
Rubin* | Match "rub" plus 0 oder mehr ys |
Rubin + | Match "rub" plus 1 oder mehr ys |
\\ d {3} | Passen Sie genau 3 Ziffern an |
\\ d {3,} | Entspricht 3 oder mehr Ziffern |
\\ d {3,5} | Passen Sie 3, 4 oder 5 Ziffern an |
\\ D \\ d + | Keine Gruppe: + wiederholt \\ d |
(\\ D \\ d) + / | Gruppiert: + wiederholt \\ D \ d Paar |
([Rr] uby (,)?) + | Match "Ruby", "Ruby, Ruby, Ruby" usw. |
Note- dass jeder Backslash zweimal in der obigen Zeichenfolge erscheint. Dies liegt daran, dass in Java und Scala ein einzelner Backslash ein Escape-Zeichen in einem Zeichenfolgenliteral ist und kein reguläres Zeichen, das in der Zeichenfolge angezeigt wird. Anstelle von '\' müssen Sie also '\\' schreiben, um einen einzelnen Backslash in der Zeichenfolge zu erhalten.
Versuchen Sie das folgende Beispielprogramm.
Beispiel
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(","))
}
}
Speichern Sie das obige Programm in Demo.scala. Die folgenden Befehle werden zum Kompilieren und Ausführen dieses Programms verwendet.
Befehl
\>scalac Demo.scala
\>scala Demo
Ausgabe
able1