Scala Reguläre Ausdrücke

Scala unterstützt reguläre Ausdrücke über dieRegexRegex-Klasse des Pakets scala.util.matching. Das folgende Beispiel zeigt, wie man mit regulären Ausdrücken Wörter findet.Scala :

Beispiel

import scala.util.matching.Regex

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

Führen Sie den obigen Code aus, das Ausgabeergebnis ist:

$ scalac Test.scala 
$ scala Test
Some(Scala)

Im Beispiel wird die Methode r() der String-Klasse verwendet, um ein Regex-Objekt zu konstruieren.

Verwenden Sie dann die Methode findFirstIn, um die erste Übereinstimmung zu finden.

Wenn Sie alle Übereinstimmungen anzeigen möchten, können Sie die Methode findAllIn verwenden.

Sie können die Methode mkString() verwenden, um die Zeichenfolgen der Regex-Übereinstimmungsergebnisse zu verketten, und können die Pipe (|) verwenden, um verschiedene Muster festzulegen:

Beispiel

import scala.util.matching.Regex

object Test {
   def main(args: Array[String]) {
      val pattern = new Regex("(S|s)cala")  // Der erste Buchstabe kann ein großes S oder ein kleines s sein
      val str = "Scala is scalable and cool"
     
      println((pattern findAllIn str).mkString(","))   // Verwenden Sie ein Komma , um zurückgegebene Ergebnisse zu verketten
   }
}

Führen Sie den obigen Code aus, das Ausgabeergebnis ist:

$ scalac Test.scala 
$ scala Test
Scala,scala

Wenn Sie den übereinstimmenden Text durch ein angegebenes Schlüsselwort ersetzen möchten, können Sie diereplaceFirstIn( )-Methode verwenden, um die erste Übereinstimmung zu ersetzen; verwenden Sie diereplaceAllIn( )-Methode, um alle Übereinstimmungen zu ersetzen. Das Beispiel sieht wie folgt aus:

Beispiel

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

Führen Sie den obigen Code aus, das Ausgabeergebnis ist:

$ scalac Test.scala 
$ scala Test
Java is scalable and cool

Reguläre Ausdrücke

Scalas reguläre Ausdrücke erben die Syntaxregeln von Java, während Java größtenteils die Regeln der Sprache Perl verwendet.

Die folgende Tabelle enthält einige häufig verwendete Regeln für reguläre Ausdrücke:

Ausdruck Matcher-Regeln
^ Entspricht der Position am Anfang der Eingabezeichenfolge.
$ Entspricht der Position am Ende der Eingabezeichenfolge.
. Entspricht einem beliebigen einzelnen Zeichen außer "\r\n".
[...] Zeichensatz. Entspricht einem beliebigen darin enthaltenen Zeichen. Zum Beispiel entspricht "[abc]" dem "a" in "plain".
[^...] Negierter Zeichensatz. Entspricht jedem Zeichen, das nicht enthalten ist. Zum Beispiel entspricht "[^abc]" den Zeichen "p", "l", "i", "n" in "plain".
\\A Entspricht der Startposition der Eingabezeichenfolge (ohne Mehrzeilenunterstützung)
\\z Ende der Zeichenfolge (wie $, aber nicht von Optionen für die Mehrzeilenverarbeitung betroffen)
\\Z Ende der Zeichenfolge oder Zeile (nicht von Optionen für die Mehrzeilenverarbeitung betroffen)
re* Null oder mehr Wiederholungen
re+ Eine oder mehr Wiederholungen
re? Null oder eine Wiederholung
re{ n} Genau n-mal wiederholen
re{ n,}
re{ n, m} Zwischen n und m Mal wiederholen
a|b a oder b entsprechen
(re) Mit re übereinstimmen und den Text in einer automatisch benannten Gruppe erfassen
(?: re) Mit re übereinstimmen, den übereinstimmenden Text nicht erfassen und dieser Gruppe keine Gruppennummer zuweisen
(?> re) Gieriger Teilausdruck
\\w Trifft auf Buchstaben, Ziffern oder Unterstriche zu
\\W Trifft auf jedes Zeichen zu, das kein Buchstabe, keine Ziffer, kein Unterstrich und kein chinesisches Zeichen ist
\\s Trifft auf jedes Whitespace-Zeichen zu, äquivalent zu [\t\n\r\f]
\\S Trifft auf jedes Zeichen zu, das kein Whitespace-Zeichen ist
\\d Trifft auf eine Ziffer zu, wie [0-9]
\\D Entspricht jedem Zeichen, das keine Ziffer ist
\\G Anfang der aktuellen Suche
\\n Zeilenumbruchzeichen
\\b Normalerweise eine Wortgrenzenposition, aber wenn sie in einer Zeichenklasse verwendet wird, repräsentiert sie Rücktaste
\\B Entspricht einer Position, die weder der Anfang noch das Ende eines Wortes ist
\\t Tabulatorzeichen
\\Q Öffnendes Anführungszeichen:\Q(a+b)*3\EKann den Text "(a+b)*3" abgleichen.
\\E Schließendes Anführungszeichen:\Q(a+b)*3\EKann den Text "(a+b)*3" abgleichen.

Beispiele für reguläre Ausdrücke

Beispiel Beschreibung
. Entspricht einem beliebigen einzelnen Zeichen außer "\r\n".
[Rr]uby Entspricht "Ruby" oder "ruby"
rub[ye] Entspricht "ruby" oder "rube"
[aeiou] Entspricht Kleinbuchstaben: aeiou
[0-9] Entspricht einer beliebigen Ziffer, wie
[a-z] Entspricht einem beliebigen ASCII-Kleinbuchstaben
[A-Z] Entspricht einem beliebigen ASCII-Großbuchstaben
[a-zA-Z0-9] Entspricht Ziffern, Groß- und Kleinbuchstaben
[^aeiou] Entspricht Zeichen außer aeiou
[^0-9] Entspricht Zeichen, die keine Ziffern sind
\\d Entspricht einer Ziffer, wie: [0-9]
\\D Entspricht einem Nicht-Ziffer-Zeichen, wie: [^0-9]
\\s Entspricht Leerraum, wie: [ \t\r\n\f]
\\S Entspricht Nicht-Leerraum, wie: [^ \t\r\n\f]
\\w Entspricht Buchstaben, Ziffern, Unterstrichen, wie: [A-Za-z0-9_]
\\W Entspricht Zeichen, die keine Buchstaben, Ziffern oder Unterstriche sind, wie: [^A-Za-z0-9_]
ruby? Entspricht "rub" oder "ruby": y ist optional
ruby* Entspricht "rub", gefolgt von null oder mehr y's.
ruby+ Entspricht "rub", gefolgt von einem oder mehreren y's.
\\d{3} Entspricht genau 3 Ziffern.
\\d{3,} Entspricht 3 oder mehr Ziffern.
\\d{3,5} Entspricht 3, 4 oder 5 Ziffern.
\\D\\d+ Keine Gruppe: + wiederholt \d
(\\D\\d)+/ Gruppe: + wiederholt das \D\d-Paar
([Rr]uby(, )?)+ Trifft auf "Ruby", "Ruby, ruby, ruby" usw. zu

Beachten Sie, dass jedes Zeichen in der obigen Tabelle zwei Backslashes verwendet. Das liegt daran, dass in Java und Scala der Backslash in Zeichenketten ein Escape-Zeichen ist. Wenn Sie also\ausgeben möchten, müssen Sie es in der Zeichenkette als\\schreiben, um einen Backslash zu erhalten. Siehe folgendes Beispiel:

Beispiel

import scala.util.matching.Regex

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

Führen Sie den obigen Code aus, das Ausgabeergebnis ist:

$ scalac Test.scala 
$ scala Test
able1
Weitere Erweiterungen