Java正则表达式和换行符-bug还是预期行为?

Java正则表达式和换行符-bug还是预期行为?,java,regex,Java,Regex,我试图用正则表达式解释一个多行字符串,但发现如果该字符串包含换行符,匹配就会失败。我没有使用多行模式,因为我没有使用锚。根据API文件: 在多行模式下,表达式^ 和$match之后或之前, 分别是一个行终止符或 输入序列的结尾。默认情况下 这些表达式只在同一时间匹配 整个过程的开始和结束 输入序列 简言之:它清楚地表明,这个标志只会改变锚的工作方式,并没有像“当您的字符串包含换行符时,您肯定应该使用它”这样的说法 这真的是一个bug,还是我错过了一些文档?或者JAVA使用RegEx方言,而我的模

我试图用正则表达式解释一个多行字符串,但发现如果该字符串包含换行符,匹配就会失败。我没有使用多行模式,因为我没有使用锚。根据API文件:

在多行模式下,表达式^ 和$match之后或之前, 分别是一个行终止符或 输入序列的结尾。默认情况下 这些表达式只在同一时间匹配 整个过程的开始和结束 输入序列

简言之:它清楚地表明,这个标志只会改变锚的工作方式,并没有像“当您的字符串包含换行符时,您肯定应该使用它”这样的说法

这真的是一个bug,还是我错过了一些文档?或者JAVA使用RegEx方言,而我的模式失败了?我使用的是jdk1.6.0_21

来自:

正则表达式
匹配任何 除行终止符外的字符 除非指定了DOTALL标志


因此,如果希望
m2.matches()
为真,则需要指定
DOTALL
标志。

我也有红色标记,但请注意模式不是
^.$
或类似的。我没有使用Ancros,因此第二种情况下,
Hello
也应该是匹配项。
matches()
检查整个字符串是否与正则表达式“
*
”匹配
*
表示“除换行符以外的任何字符0次或多次”。因此它匹配,
H
,匹配
e
,然后
l
然后
o
,然后当它到达
\r
时不再匹配并返回false。你明白吗?此代码与
字符的行为有关,而不是锚定。因此,如果启用了
DOTALL
标志,则
m2
将匹配
Hello
并访问
\r\n
。规范现在会说“正则表达式
匹配任何字符,包括行终止符!”因此
m2
将匹配
\r
\n
并返回true。@Philip Thnaks。我理解。事实上,我认为如果存在匹配项,
matches()。如果我想匹配wole字符串,我可以在我的模式中添加锚点,因此我觉得这有点违反直觉,但我想这就是它的方式…@vbence-find
方法告诉你是否存在部分匹配;i、 正则表达式匹配一个子字符串。
匹配
方法告诉您是否存在完全匹配;i、 正则表达式匹配完整的字符串。如果您使用的是标准Java API,而它的行为与您预期的不一样,那么您应该质疑的是您对API的理解。。。而不是追求你发现了一个bug的理论。@Stephen我知道,我知道。但它从来没有越过我的main,
匹配
匹配整个字符串,即使我不使用锚。JAVA API是迄今为止我在计算世界中遇到的最一致、计划最周密的东西,因此我盲目地相信该方法会如我所猜测的那样起作用。如果你认为JAVA API“一致且计划良好”,那么你就没有给予足够的关注。其实不是这样的事@tchrist这个话题非常适合聊天室,但我不想在这里讨论它,因为它是一个非常广泛和分支的话题。(有些人甚至可以说是主观的)。
public static void main(String[] args) {
    Pattern p = Pattern.compile(".*");

    Matcher m1 = p.matcher("Hello");
    System.out.println("m1: " + m1.matches());    // true

    Matcher m2 = p.matcher("Hello\r\n");
    System.out.println("m2: " + m2.matches());    // false
}