换行符打破了Java Regex的负面印象

Bak*_*rak 1 java regex

我正在尝试使用带有负向后看的正则表达式模式来验证电子邮件地址。更具体地说,只允许那些不以特定序列结尾的对象@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
Run Code Online (Sandbox Code Playgroud)

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

And*_*eas 5

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

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

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

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

要么:

Pattern p = Pattern.compile("(?s)^.*(?<!@mydomain\\.de)$")
Run Code Online (Sandbox Code Playgroud)

public static final int DOTALL

启用dotall模式。

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

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