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 がどのように提供されるかを確認しました。これは、通常の式
のさまざまな使用例に対処するのに役立ちます。