正規表現で、.(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);
}
}