uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

正規表現における部分文字列の後方参照(キャプチャリング)をスマートに


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()を追加
  • トップレベルでは引数の()を省略できる
  • クロージャプロパティ