与 word-boundary 结合使用时,我遇到了 Java Regex 的一个奇怪问题\b
。通读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 String \\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。但仍然很好奇为什么会出现这种奇怪的行为。
我浏览了许多有关 问题的 stackoverflow 主题\b
,但找不到相关的主题。