25

%nFormatterオブジェクトまたはを使用して改行を取得した場合、改行を含む文字列を照合できませんString.format()。次のプログラムをご覧ください。

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です。

4

2 に答える 2

67

Pattern.DOTALLフラグを設定して.改行を一致させることができますが、デフォルトでは一致しません。それは(?s)表記法で行われます。したがって、この正規表現はあなたが望むことをします:

    String pattern = "(?s).*[\n\r].*";
于 2012-07-25T06:49:31.717 に答える
21

Windowsでは、Javaでは\nLF、\rCR、%nCRLFです。あなたのパターンは後者と一致しません。

\RJava 8以降、正規表現で使用して、任意の行末シーケンスに一致させることができるようになりました。

改行マッチャー

\RUnicodeの改行シーケンスは、次のようになります。\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
于 2012-07-25T08:50:06.530 に答える