Arbeiten mit Regex in Scala

Suraj P 16 Februar 2024
  1. Regex-Klasse in Scala
  2. Finden Sie Übereinstimmungen im Text in Scala
  3. Verwendung von Regex zum Ersetzen eines Textes in Scala
  4. Verwenden Sie Regex, um Werte in Scala zu extrahieren
  5. Fazit
Arbeiten mit Regex in Scala

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)

Code ausführen

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

Code ausführen

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))

Code ausführen

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

Code ausführen

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

Code ausführen

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

Code ausführen

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

Code ausführen

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.

Autor: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub