文字列中から正規表現にマッチした箇所を取り出したい。
Regexを使う。
val s = "GGACGATATAATTTATAATACCGT"
val r = "TATAA".r // Stringは.rで正規表現に変換できる
for(m <- r.findAllIn(s).matchData)
println("Found a match in [%s, %s)".format(m.start, m.end))
実行結果
Found a match in [6, 11)
Found a match in [13, 18)
findAllInではマッチした文字列を切り出すMatchIterator
(Iterator[String]
を継承)が返るが、matchData
を呼び出すことで、Iterator[Match]
に変換でき、こちらでは、マッチの位置(start, end)や、マッチした文字列(matched)などの情報も得られる。
括弧によるグループを使用して、マッチした箇所を各々取り出せる。
val r = "(chr)([0-9]+)".r
val l = List("chr1", "chr10", "chr21")
for(chr <- l; m <- r.findFirstMatchIn(chr)) {
val chrPrefix = m.group(1)
val chrNum = m.group(2)
println("prefix:%s, num:%s".format(chrPrefix, chrNum))
}
グループ番号0はパターン全体に対応。
実行結果
prefix:chr, num:1
prefix:chr, num:10
prefix:chr, num:21
さらに、グループに名前を付けることもできる。
val r = new scala.util.matching.Regex("(chr)([0-9]+)", "prefix", "num")
val l = List("chr1", "chr10", "chr21")
for(chr <- l; m <- r.findFirstMatchIn(chr)) {
println("prefix:%s, num:%s".format(m.group("prefix"), m.group("num")))
}
実行結果
prefix:chr, num:1
prefix:chr, num:10
prefix:chr, num:21