正規表現における部分文字列の後方参照(キャプチャリング)をスマートに
http://groovyconsole.appspot.com/script/202001
にも投稿しましたが、
java.util.regex.Matcher.metaClass.call = { Closure c -> while (delegate.find()) { (0..delegate.groupCount()).each { c.setProperty("\$$it", delegate.group(it)) } c.call(delegate.group(0)) } } line = "aaa bb ccccc aa b c" (line =~ /(a+) (b+) (c+)/) { println $1 println $2 println $3 }
Groovyの以下の機能を使ってます。
- callメソッドを定義すると()でcallメソッドが呼び出されるのでMatcherにクロージャを引数としてとるcall()を追加
- トップレベルでは引数の()を省略できる
- クロージャプロパティ