takafumi blog

日々の勉強メモ

【Scala】 正規表現による文字列検索

環境   Scala 2.11.6 CentOS7.0

matches

シンプル。ただし部分一致ではなく全体一致のみ。

scala> val target = "abcdefghijklmnopqrstuvwxyz"
target: String = abcdefghijklmnopqrstuvwxyz

scala> target matches """mno"""
res1: Boolean = false

scala> target matches """[a-z]+"""
res2: Boolean = true

scala> target matches """abcdefghijklmnopqrstuvwxyz"""
res3: Boolean = true



Regex

正規表現コレクション

▽ 初期化

以下のように初期化

scala> val p1 = "simple"
p1: String = simple

scala> val r1 = new scala.util.matching.Regex(p1)
r1: scala.util.matching.Regex = simple

▽ 省略形

省略形としてString.rでも呼び出し可能

scala> val r2 = p1.r
r2: scala.util.matching.Regex = simple



findFirstIn

【定義】

def findFirstIn(source: CharSequence): Option[String]

パターンに一致する文字列を抽出する。 結果はOption型で返されるので便利。

【例】

scala> val r = "morning".r
r: scala.util.matching.Regex = morning

scala> r.findFirstIn("good morning everyone!")
res1: Option[String] = Some(morning)

// Not Match
scala> r.findFirstIn("good evening everyone!")
res2: Option[String] = None



findPrefixOf

【定義】

def findPrefixOf(source: CharSequence): Option[String]

文の先頭がパターンに一致する文字列であれば抽出する。 結果はOption型で返されるので便利。

【例】

scala> val r = "morning".r
r: scala.util.matching.Regex = morning

scala> r.findFirstIn("morning is beautiful!")
res1: Option[String] = Some(morning)

// Not Match
scala> r.findPrefixOf("good morning everyone!")
res2: Option[String] = None



findAllIn

【定義】

def findAllIn(source: CharSequence): Regex.MatchIterator

パターンに一致する文字列を全て抽出する。 結果はイテレータとして返される。

【例】

scala> val r = """\d{2,4}""".r
r: scala.util.matching.Regex = \d{2,4}

scala> val date = r.findAllIn("2015-08-05 16:45:40")
date: scala.util.matching.Regex.MatchIterator = non-empty iterator

scala> for(v <- date) println(v)
2015
08
05
16
45
40

// Not Match
scala> val date = r.findAllIn("aaa bbb ccc")
date: scala.util.matching.Regex.MatchIterator = empty iterator



findFirstMatchIn

【定義】

def findFirstMatchIn(source: CharSequence): Option[scala.util.matching.Regex.Match]

パターン中のグルーピングを抽出する事ができる。 Option型の返り値なので、getOrElseなどで、中身を取り出して、group(i)でグループを抽出可能。

【例】

scala> val r = """(\d{4})/\d{2}/(\d{2})""".r
r: scala.util.matching.Regex = (\d{4})/\d{2}/(\d{2})

scala> val date = r.findFirstMatchIn("Date : 2015/08/02")
date: Option[scala.util.matching.Regex.Match] = Some(2015/08/02)

scala> println(date.get.group(0))
2015/08/02

scala> println(date.get.group(1))
2015

scala> println(date.get.group(2))
02


// Not Match
scala> val date = r.findFirstMatchIn("Date : 2015-08-02")
date: Option[scala.util.matching.Regex.Match] = None



グルーピング

正規表現のグループ部分に名前をつけて抽出する

scala> val r = new scala.util.matching.Regex("""(\d\d\d\d)-(\d\d)-(\d\d)""", "year", "month", "day")
r: scala.util.matching.Regex = (\d\d\d\d)-(\d\d)-(\d\d)

scala> val m = r.findFirstMatchIn("2015-08-19")
m: Option[scala.util.matching.Regex.Match] = Some(2015-08-19)

scala> m.get.group("year")
res35: String = 2015

scala> m.get.group("month")
res36: String = 08

scala> m.get.group("day")
res37: String = 19