正規表現による文字列のマッチと置換

正規表現を使って文字列をマッチさせるには、Regexとmatch式を組み合わせれば簡単だ。正規表現パターンを3つのダブルクォーテーションで括り、最後にrメソッドを呼び出すだけでRegexのインスタンス(コンパイル済み正規表現パターン)を得られる。正規表現パターンを3つのダブルクォーテーションで括れば、文字列中の\をエスケープする必要がないので、\を2つ重ねなくて良い。

後は、生成したRegexとmatch式を使って任意の文字列とマッチさせるだけである。正規表現パターンはJavaのものがそのまま使える。最初に日付をマッチさせてみよう。match式はマッチしたcaseの値を返すので、以下の例のresult変数は"マッチしました。"という文字列で初期化される。

// 単にマッチするかしないか
val r1 = """\d{4}-\d{2}-\d{2}""".r
// \を2つ書いても良いならばダブルクォーテーション1つで括っても良い
//val r1 = "\\d{4}-\\d{2}-\\d{2}".r
val result = "2015-02-15" match {
  case r1(_*) => "マッチしました。"
  case _ => "マッチしませんでした。"
}
println(result)
マッチしました。

次に、正規表現グループを使って、マッチした年、月、日を取得する。正規表現パターンは、先ほどのものの年、月、日部分をそれぞれ()で括ってグループを定義しておく。すると、case節でこれをそれぞれyear、month、dayという変数として取り出すことができる。取り出した変数は、printlnとs補間子で出力してみた。

// マッチしたら、さらにグループを取り出す
val r2 = """(\d{4})-(\d{2})-(\d{2})""".r
"2015-02-15" match {
  case r2(year, month, day) => println(s"${year}年${month}月${day}日です。")
  case _ => println("マッチしませんでした。")
}
2015年02月15日です。

今までの例は数字だったが、もちろんそれ以外にアルファベット等もマッチさせることができる。この時、正規表現パターンに埋め込みフラグ(?i)を追加すれば、大文字小文字の区別なく(case-insensitive)マッチさせることができる。つまり、通常は大文字小文字を区別する(casesensitive)。以下の例では、"Apple"という文字列は"apple"という正規表現パターンにマッチする。

// 大文字小文字を区別しない
val r3 = """(?i)apple""".r
"Apple" match {
  case r3(_*) => println("マッチしました。")
  case _ => println("マッチしませんでした。")
}
マッチしました。

最後は置換だ。以下の例は、replaceAllInメソッドを使って文字列"banana"中の"a"をすべて"@"に置き換えている。

// a→@に置換
val r4 = """a""".r
println(r4.replaceAllIn("banana", "@"))
b@n@n@

もちろん日本語でもOKだ。

// りんご→リンゴに置換
val r5 = """りんご""".r
println(r5.replaceAllIn("私はりんごが好きです。", "リンゴ"))
私はリンゴが好きです。
(2015/02/16)

新着情報
【オープンソースソフトウェア環境構築】Apple silicon Macで開発環境を構築
【Rust Tips】Actix webでJSONをPOSTする
【Rust Tips】コマンドライン引数を取得する

Copyright© 2004-2018 モバイル開発系(K) All rights reserved.
[Home]