Arbeiten mit Regex in Scala
-
Regex
-Klasse in Scala - Finden Sie Übereinstimmungen im Text in Scala
-
Verwendung von
Regex
zum Ersetzen eines Textes in Scala -
Verwenden Sie
Regex
, um Werte in Scala zu extrahieren - Fazit
Reguläre Ausdrücke definieren ein allgemeines Muster, das verwendet wird, um die Eingabedaten abzugleichen. Diese sind sehr nützlich für den Musterabgleich und die Textverarbeitung oder -analyse.
In diesem Artikel lernen wir, wie man mit Regex (regulären Ausdrücken) in Scala arbeitet.
Regex
-Klasse in Scala
Regex
ist eine Klasse in Scala, die aus scala.util.matching.Regex
importiert wird, basierend auf dem Java-Paket java.util.regex
, das ausgiebig für Mustervergleich und Textparsing verwendet wird. Regex
-Objekte können auf zwei Arten erstellt werden.
Die erste Methode besteht darin, das Objekt der Klasse Regex
explizit zu erstellen.
val x = new Regex("you")
Die zweite Methode ist die Verwendung der r
-Methode.
val x = "You".r
Schauen wir uns verschiedene Anwendungsfälle für reguläre Ausdrücke mit Regex
an.
Finden Sie Übereinstimmungen im Text in Scala
Das Finden von Übereinstimmungen im Text ist einer der häufigsten Anwendungsfälle der Regex.
Beispielcode:
import scala.util.matching.Regex
object myClass
{
def main(args: Array[String])
{
val x = new Regex("Tony")
val text = "Iron man is also known as Tony Stark. Tony is an Avenger"
println(x findFirstIn text)
}
}
Ausgabe:
Some(Tony)
Im obigen Code haben wir die Methode findFirstIn
verwendet, um die erste Übereinstimmung des regulären Ausdrucks zu finden, und die Methode gibt ein Option[String]
-Objekt zurück.
Beispielcode:
import scala.util.matching.Regex
object myClass
{
def main(args: Array[String])
{
val reg = new Regex("([0-9]{2})\\-([0-9]{3})")
val text = "He lives in Warsaw 01-011 and she lives in Cracow 30-059"
println((reg findAllIn text).mkString(","))
}
}
Ausgabe:
01-011,30-059
Im obigen Beispiel haben wir die Methode findAllIn
verwendet, um alle Übereinstimmungen zu finden und den MatchIterator
zurückzugeben. Wir haben dann die Methode mkString
verwendet, um die Ausgabe in einen String zu konvertieren, der durch ein ,
(Komma) getrennt ist.
Wir haben auch die Methode findFirstMatchIn
. Sie funktioniert wie die Methode findFirstIn
, gibt aber Option[Match]
zurück.
Beispielcode:
import scala.util.matching.Regex
object myClass
{
def main(args: Array[String])
{
val reg = new Regex("([0-9]{2})\\-([0-9]{3})")
val text = "He lives in Warsaw 01-011 and she lives in Cracow 30-059"
val result = reg.findFirstMatchIn(text)
println(Some("011"), for (x <- result) yield x.group(2))
}
}
Ausgabe:
(Some(011),Some(011))
Verwendung von Regex
zum Ersetzen eines Textes in Scala
Dies ist ein weiterer Anwendungsfall von Regex
, der Text ersetzt. Manchmal haben wir während der Textanalyse einen Teil davon durch etwas anderes ersetzt.
Beispielcode:
import scala.util.matching.Regex
object myClass
{
// Main method
def main(args: Array[String])
{
val reg = new Regex("([0-9]{2})\\-([0-9]{3})")
val text = "He lives in Warsaw 01-011 and she lives in Cracow 30-059"
println(reg replaceFirstIn(text, "1234"))
}
}
Ausgabe:
He lives in Warsaw 1234 and she lives in Cracow 30-059
Im obigen Code haben wir die Methode replaceFirstIn
verwendet, um die erste im Text gefundene Übereinstimmung durch die Zeichenfolge "1234"
zu ersetzen.
Beispielcode:
import scala.util.matching.Regex
object myClass
{
// Main method
def main(args: Array[String])
{
val reg = new Regex("([0-9]{2})\\-([0-9]{3})")
val text = "He lives in Warsaw 01-011 and she lives in Cracow 30-059"
println(reg replaceAllIn(text, "1234"))
}
}
Ausgabe:
He lives in Warsaw 1234 and she lives in Cracow 1234
Im obigen Code haben wir die Methode replaceAllIn
verwendet, die alle im Text gefundenen Übereinstimmungen durch "1234"
ersetzt.
Verwenden Sie Regex
, um Werte in Scala zu extrahieren
Wenn wir eine Übereinstimmung mit regulären Ausdrücken finden, können wir Regex
verwenden, um Werte mittels Musterabgleich zu extrahieren.
Beispielcode:
import scala.util.matching.Regex
object myClass {
def main(args: Array[String]) {
val timestamp = "([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{3})".r
val time = "12:20:01.411" match {
case timestamp(hour, minutes, _, _) => println(s"It is $minutes minutes after $hour")
}
}
}
Ausgabe:
It is 20 minutes after 12
In Scala verhält sich Regex
standardmäßig so, als wäre das Muster verankert
. Zum Beispiel wird das Muster in die Mitte von ^
- und $
-Zeichen wie ^pattern$
gesetzt, aber wir können diese Zeichen mit der Methode unanchored
entfernen, die in der Klasse UnanchoredRegex
vorhanden ist.
Mit dieser Hilfe können wir zusätzlichen Text in unserer Zeichenfolge haben und trotzdem finden, was wir brauchen.
Beispielcode:
import scala.util.matching.Regex
object myClass
{
def main(args: Array[String]) {
val timestamp = "([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{3})".r
val temp = timestamp.unanchored
val time = "It is 12:20:01.411 in New York" match {
case temp(hour, minutes, _, _) => println(s"It is $minutes minutes after $hour")
}
}
}
Ausgabe:
It is 20 minutes after 12
Java erbt die meisten seiner regulären Ausdrücke und seine Regex
-Funktionen von der Programmiersprache Perl, und Scala erbt seine Syntax für reguläre Ausdrücke von Java.
Schauen wir uns einige der häufig verwendeten regulären Ausdrücke von Scala aus Java an.
Unterausdruck | Streichhölzer |
---|---|
^ |
Es entspricht dem Anfang der Zeile. |
$ |
Es passt zum Anfang vom Ende. |
[...] |
Es wird verwendet, um ein beliebiges einzelnes Zeichen in der Klammer abzugleichen. |
[^...] |
Es wird verwendet, um jedes einzelne Zeichen abzugleichen, das nicht in der Klammer vorhanden ist |
\\w |
Es wird verwendet, um die Wortzeichen abzugleichen. |
\\d |
Es wird verwendet, um die Ziffern abzugleichen. |
Fazit
In diesem Artikel haben wir die in der Scala-Standardbibliothek vorhandene Klasse Regex
kennengelernt. Wir haben auch gesehen, wie es verschiedene APIs bereitstellt, die uns helfen, mit den verschiedenen Anwendungsfällen von regulären Ausdrücken
umzugehen.