Re:Re:改行を含むとGroovyの正規表現がうまく動かない
僕が以前書いた
改行を含むとGroovyの正規表現がうまく動かない
に対して、
Re:改行を含むとGroovyの正規表現がうまく動かない
をid:fumokmmさんにトラックバックいただき教えてもらいました。多謝!
解決策としては、
def text3 = '''a=b hello c=d''' assert text3 ==~ /a=(.|\n)*/
もしくは、
import java.util.regex.* def text4 = '''a=b hello c=d''' assert Pattern.compile(/a=.*/, Pattern.DOTALL).matcher(text4).matches()
というものでした。すっきりするのは上のほうなんですが、正確には下だよなぁ。でもgroovyならではのシンプルさが失われ、いかにもJavaのコードという感が露呈しています。id:fumokmmさん自身も以下のように仰っています。
これ、せっかくGroovyなんで ==~ みたいな演算子で指定できないもんですかねぇ。
というわけで調べてみたところ埋め込みフラグを使えばシンプルにPattern.DOTALLを指定できることが分かりました。こんな感じです。
assert text5 ==~ /(?s)a=.*/
わぁシンプル♪この類のフラグは他にも色々あって代表的なやつだと大文字小文字を区別しないiフラグとか。以下のようにすれば「a=b」となっている部分が「A=b」でもヒットするようになります。
assert text5 ==~ /(?is)a=.*/