【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