2

任何人都可以帮助使用正则表达式吗?这段代码工作得很好。

public static void main(String[] args) {

    String s = "with name=successfully already exist\n";

    Pattern p = Pattern.compile(".+name=.*successfully.+", Pattern.DOTALL);
    java.util.regex.Matcher m = p.matcher(s);

    if (m.matches()) {
        System.out.println("match");
    } else {
        System.out.println("not match");
    }

}

但是此代码返回“不匹配”。为什么?

public static void main(String[] args) {

    String s = "with name=successfully already exist\n";

    if (s.matches(".+name=.*successfully.+")) {
        System.out.println("match");
    } else {
        System.out.println("not match");
    }

}
4

2 回答 2

5

两者之间的唯一区别是第一个示例中的 DOTALL 标志。

如果没有该标志,\n字符串末尾的 将与最后一个模式 ( .+) 不匹配。

http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#DOTALL

在 dotall 模式下,表达式 . 匹配任何字符,包括行终止符。默认情况下,此表达式不匹配行终止符。

请注意,matches尝试匹配整个字符串(在您的情况下包括尾随换行符),而不仅仅是尝试查找子字符串(这在 Java 中与许多其他语言不同)。

于 2013-04-11T12:04:44.780 回答
4

您在使用 compile() 时提供的 Pattern.DOTALL 参数使得 '.' 匹配“行结束符”。您需要提供一个内联标记以使 match() 执行相同的操作。尝试以下操作:

s.matches("(?s).+name=.*successfully(?s).+")

干杯。

于 2013-04-11T12:05:56.707 回答