web-dev-qa-db-ja.com

正規表現がFormatterオブジェクトから取得した改行と一致しません

FormatterオブジェクトまたはString.format()%nを使用して改行を取得すると、改行を含む文字列と一致しません。次のプログラムをご覧ください。

public class RegExTest {

  public static void main(String[] args) {
    String input1 = String.format("Hallo\nnext line");
    String input2 = String.format("Hallo%nnext line");
    String pattern = ".*[\n\r].*";
    System.out.println(input1+": "+input1.matches(pattern));
    System.out.println(input2+": "+input2.matches(pattern));
  }

}

そしてその出力:

Hallo
next line: true
Hallo
next line: false

ここで何が起こっているのですか? 2番目の文字列が一致しないのはなぜですか?

Javaのバージョンは1.6.0_21です。

20
Axel

Pattern.DOTALL作成するフラグ.改行に一致しますが、デフォルトでは一致しません。 (?s)表記。だから、この正規表現はあなたが望むことをします:

    String pattern = "(?s).*[\n\r].*";
49
Keppil

Windowsでは、Javaでは、\nはLF、\rはCR、%nはCRLFです。あなたのパターンは後者と一致しません。

Java 8以降)、正規表現で \R を使用して、任意の行末シーケンスに一致させることができます。

改行マッチャー

\R Unicodeの改行シーケンスは\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]と同等

例:

String pattern = ".*\\R.*";
String.format("Hallo\nnext line").matches(pattern); // true
String.format("Hallo%nnext line").matches(pattern); // true
String.format("Hallo same line").matches(pattern); // false
16
OrangeDog