Scala で正規表現を使用する
-
Scala の
Regexクラス - Scala のテキストで一致するものを見つける
-
Scala で文字列を置換するために
Regexを使用する -
Regexを使用して 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 がどのように提供されるかを確認しました。これは、通常の式のさまざまな使用例に対処するのに役立ちます。
