1

次のスニペットがあるとします。

Pattern pt = Pattern.compile("\ndog", Pattern.LITERAL);
Matcher mc = pt.matcher("\ndogDoG");
while(mc.find())
{

    System.out.printf("I have found %s starting at the " +
            "index %s and ending at the index    %s%n",mc.group(),mc.start(),mc.end());

}

出力は次のようになります。

I have found 
dog starting at the index 0 and ending at the index 4.

Pattern.LITERALこれは、このリンクがどのように言っているのかを指定したにもかかわらず、次のことを意味します。

Pattern.LITERAL パターンのリテラル解析を有効にします。このフラグが指定されている場合、パターンを指定する入力文字列は一連のリテラル文字として扱われます。入力シーケンス内のメタ文字またはエスケープ シーケンスには、特別な意味はありません。

ただし、上記のスニペットからの出力は\nエスケープ シーケンスを解釈しますが、リテラルのようには扱いません。

このチュートリアルでそうすべきではないと指定しているのに、なぜそのようになるのでしょうか?

\n は行末記号ですが、エスケープ シーケンス文字のままです。

4

2 に答える 2

2

ただし、これはまだエスケープ シーケンス文字です。

いいえ、ちがいます。改行文字です。できるよ:

char c = '\n';

したがって、出力が期待されます。

パターンを次のようにコンパイルする場合に注意してください。

Pattern.compile("\n")

then\nはリテラル文字\nです。

ただし、次のようにコンパイルする場合:

Pattern.compile("\\n")

それはエスケープシーケンスです。そしてそれらはたまたま同じものに一致します。

于 2013-07-11T10:40:14.593 に答える