Scala で正規表現を使用する

Suraj P 2024年2月16日
  1. Scala の Regex クラス
  2. Scala のテキストで一致するものを見つける
  3. Scala で文字列を置換するために Regex を使用する
  4. Regex を使用して Scala の値を抽出する
  5. まとめ
Scala で正規表現を使用する

正規式は、入力データの照合に使用される一般的なパターンを定義します。これらは、パターンのマッチングやテキストの処理または解析に非常に役立ちます。

この記事では、Scala で Regex(通常の式)を操作する方法を学習します。

Scala の Regex クラス

Regex は、パターンマッチングとテキスト解析に広く使用されている Java パッケージ java.util.regex に基づいて scala.util.matching.Regex からインポートされた Scala のクラスです。Regex オブジェクトは 2つの方法で作成できます。

最初の方法は、Regex クラスオブジェクトを明示的に作成することです。

val x = new Regex("you")

2 番目の方法は、r メソッドを使用することです。

val x = "You".r

Regex を使用した正規式のさまざまな使用例を見てみましょう。

Scala のテキストで一致するものを見つける

テキストで一致するものを見つけることは、Regex の最も一般的な使用例の 1つです。

サンプルコード:

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

出力:

Some(Tony)

コードを実行

上記のコードでは、findFirstIn メソッドを使用して Regular 式の最初の一致を検索し、このメソッドは Option[String] オブジェクトを返します。

サンプルコード:

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(","))
    }
}

出力:

01-011,30-059

コードを実行

上記の例では、findAllIn メソッドを使用してすべての一致を検索し、MatchIterator を返しました。次に、mkString メソッドを使用して、出力を ,(comma)で区切られた文字列に変換しました。

findFirstMatchIn メソッドもあります。これは findFirstIn メソッドのように機能しますが、Option[Match] を返します。

サンプルコード:

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

出力:

(Some(011),Some(011))

コードを実行

Scala で文字列を置換するために Regex を使用する

これは、テキストを置き換える Regex の別の使用例です。テキストの解析中に、その一部を別の部分に置き換えた可能性があります。

サンプルコード:

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

出力:

He lives in Warsaw 1234 and she lives in Cracow 30-059

コードを実行

上記のコードでは、replaceFirstIn メソッドを使用して、テキストで最初に一致したものを文字列"1234"に置き換えています。

サンプルコード:

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

出力:

He lives in Warsaw 1234 and she lives in Cracow 1234

コードを実行

上記のコードでは、replaceAllIn メソッドを使用しました。このメソッドは、テキストで見つかったすべての一致を"1234"に置き換えます。

Regex を使用して Scala の値を抽出する

正規表現との一致が見つかったら、Regex を使用してパターン照合を使用して値を抽出できます。

コード例:

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

出力:

It is 20 minutes after 12

コードを実行

Scala では、デフォルトで Regex はパターンがアンカーされているように動作します。たとえば、パターンは^^pattern$ のような $ 文字の中央に配置されますが、UnanchoredRegex クラスにあるメソッド unanchored を使用してこれらの文字を削除できます。

この助けを借りて、文字列に追加のテキストを入れても、必要なものを見つけることができます。

コード例:

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

出力:

It is 20 minutes after 12

コードを実行

Java はほとんどの正規表現とその Regex 機能を Perl プログラミング言語から継承し、Scala はその正規表現構文を Java から継承します。

Java から取得した Scala の一般的に使用される正規式のいくつかを見てみましょう。

部分式 一致する
^ 行頭と一致します。
$ 終わりの始まりと一致します。
[...] これは、括弧内に存在する任意の 1 文字と一致させるために使用されます。
[^...] 括弧内に存在しない単一の文字と一致させるために使用されます
\\w 単語の文字を一致させるために使用されます。
\\d 数字を一致させるために使用されます。

まとめ

この記事では、Scala 標準ライブラリに存在する Regex クラスについて学習しました。また、さまざまな API がどのように提供されるかを確認しました。これは、通常の式のさまざまな使用例に対処するのに役立ちます。

著者: 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