java - 换行符打破了 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
解决方案
默认情况下,点 ( .
) 通配符不匹配行终止符。
这意味着^.*$
与第二个字符串不匹配。
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 中就是这样称呼的。)
推荐阅读
- reactjs - 如何在反应中使用带参数的函数作为道具
- java - 应用程序在到达 RecyclerView Android 的末尾时停止
- android - 如何检查我的 RV 物品何时被刷卡?
- javascript - 我的石头剪刀布游戏不工作,变量 userChoice 的值保持不变
- plot - 将列值添加到八度条形图
- python - 如何循环一个已经在子进程中循环python代码的for循环5次?
- drupal - Drupal 7 print l() 查询字符串以特殊字符显示
- python - mayavi:两个表面相互阻碍,即使它们不相交
- c# - PermutationFeatureImportance 返回的特征比模型提供的更多
- flutter - Flutter iOS/Andriod 在哪里保存数据以便于下载/传输