Saturday, January 16, 2010 / Java, Regex

正規表現でテキスト置きかえ処理, 複数行にマッチさせる方法

正規表現で、.(dot)は改行にはマッチしない。これがポイントだった。 そこで、Pattern.DOTALL オプションをつけて、regex をcompileしてやれば、 .(dot)は改行にもマッチする。 したがって、以下のような Testクラスがあった場合に、改行含んだ状態のStringをコンストラクタに与えると、見事に複数行に渡っていても処理できる。

処理クラス

public class Test{
    public Test(String str){

       String regex="(<!DOCTYPE.*?>)";

       //Pattern pat=Pattern.compile(regex,Pattern.MULTILINE);
       Pattern pat=Pattern.compile(regex,Pattern.DOTALL);

       Matcher m=pat.matcher(str);

       if( m.find() ){
         System.out.println( m.group(1) );
       }
    }
}

※Pattern.MULTILINEでなく、DOTALLを使うのがポイント ただし、改行にマッチさせる正規表現を書けば、MULTILINEオプションを使っても同じことができるような気がするが、テストしていない。

複数行にマッチするかどうかのテストコード

public class Test2{
    public static void main(String[] args){
        String teststr="<!DOCTYPE book "
            +System.getProperty("line.separator")
            +" PUBLIC \"-//ObjectDesign//DTD sample//EN\" \"\">";
        new Test(teststr);
    }
}