【发布时间】:2015-01-05 22:13:59
【问题描述】:
当与单词边界\b 结合使用时,我遇到了 Java 正则表达式的一个奇怪问题。
通读Oracle - RegexBounds和RegularExpressions - WordBoundaries
下面是我的正则表达式(Java 字符串)(用于电子邮件地址)
"\\b[A-Z0-9._!#$%&'*+-/=?^`{}|~]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}$"
此正则表达式匹配电子邮件test$@example.com,但不匹配$test@example.com。
但是,当我删除 \b(Java 字符串 \\b)时,它会匹配这两个电子邮件。正则表达式中的所有特殊字符都是这种情况。
\b 在正则表达式的排序中发生了什么?我认为[A-Z0-9._!#$%&'*+-/=?^`{}|~]+ 应该以任何顺序匹配文本,而不管\b
代码片段:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ValidationUtil {
private static final String EMAIL_ADDRESS_REGEX = "\\b[A-Z0-9._!#$%&'*+-/=?^`{}|~]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}$";
private static final Pattern EMAIL_ADDRESS_PATTERN = Pattern.compile(EMAIL_ADDRESS_REGEX, Pattern.CASE_INSENSITIVE);
public static boolean isValidEmail(String email) {
if (email == null) {
return false;
}
Matcher matcher = EMAIL_ADDRESS_PATTERN.matcher(email);
return matcher.matches();
}
}
在这个问题之后,我将正则表达式验证移至apache-commons EmailValidator。但仍然很好奇为什么会出现这种奇怪的行为。
我浏览了许多关于 \b 问题的 stackoverflow 主题,但找不到相关主题。
【问题讨论】:
标签: java regex word-boundary