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")

然后\n是文字字符\n

但是如果你编译:

Pattern.compile("\\n")

那么它是一个转义序列。他们碰巧匹配相同的东西。

于 2013-07-11T10:40:14.593 回答
1

Pattern.LITERAL关心正则表达式文字,而不是字符串文字

因此,它被视为\\nbackslashn(而不是换行符的正则表达式标记),但它被视为\n它所代表的换行符(因此忽略它)。

于 2013-07-11T10:38:49.307 回答