文字列中から正規表現にマッチした箇所を取り出したい。

解法

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
comments powered by Disqus