This question already has answers here:
How do I match any character across multiple lines in a regular expression?
                                
                                    (23个答案)
                                
                        
                                4个月前关闭。
            
                    
我正在尝试使用带有负向后看的正则表达式模式来验证电子邮件地址。更具体地说,只允许那些没有以特定序列@mydomain.de结尾的代码。

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

我知道使用.endsWith()通常可以更轻松地解决此问题。我只是想在Javax模式注释中使用正则表达式。

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

p.matcher("[email protected]").matches()  // => true
p.matcher("[email protected]\r\n").matches()  // => false


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

最佳答案

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

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

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

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


要么:

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



  public static final int DOTALL
  
  启用dotall模式。
  
  在dotall模式下,表达式.与任何字符匹配,包括行终止符。默认情况下,此表达式不匹配行终止符。
  
  也可以通过嵌入式标志表达式(?s)启用Dotall模式。 (s是“单行”模式的助记符,在Perl中被称为。)

10-04 18:02