首页 > 解决方案 > 换行符打破了 Java 正则表达式的负面回顾

问题描述

我正在尝试使用带有负面后视的正则表达式模式来验证电子邮件地址。更具体地说,只允许那些不以特定序列结尾的@mydomain.de

这适用于我的大多数测试字符串。但是,在字符串 ( ) 末尾添加换行符\r\n似乎会破坏它,因为它不再匹配。

我知道这通常可以更容易地使用.endsWith(). 我只是打算在 javax 模式注释中使用正则表达式。

Pattern p = Pattern.compile("^.*(?<!@mydomain\\.de)$")

p.matcher("test@gmail.com").matches()  // => true
p.matcher("test@gmail.com\r\n").matches()  // => false

我希望两个字符串都匹配,因为它们不会以禁止序列结尾@mydomain.de

标签: javaregex

解决方案


默认情况下,点 ( .) 通配符不匹配行终止符。

这意味着^.*$与第二个字符串不匹配。

DOTALL您可以通过指定模式使其匹配所有字符:

Pattern p = Pattern.compile("^.*(?<!@mydomain\\.de)$", Pattern.DOTALL)

或者:

Pattern p = Pattern.compile("(?s)^.*(?<!@mydomain\\.de)$")

public static final int DOTALL

启用 dotall 模式。

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

Dotall 模式也可以通过嵌入式标志表达式启用(?s)。(s 是“单行”模式的助记符,在 Perl 中就是这样称呼的。)


推荐阅读