java matcher不处理^和$符号

时间:2013-09-06 08:39:02

标签: java regex matcher

有电子邮件模式:

^[a-zA-Z0-9][\w.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z.]*[a-zA-Z]$

以及尝试从字符串中获取电子邮件的示例代码:

String email = "NAME <firstname_lastname@domain.com>";

Pattern pattern = Pattern.compile(EMAIL_PATTERN);
Matcher matcher = pattern.matcher(email);

if (matcher.find()) {
    System.out.println(matcher.group());
}

当regexp包含^$个字符时,matcher.find()返回false,但是当regexp没有这些字符时,一切都很好:我在控制台中看到firstname_lastname@domain.com。 / p>

请您解释有和没有^$的正则表达式之间的区别吗?

如何强制匹配器使用包含^$的正则表达式?

2 个答案:

答案 0 :(得分:1)

^$分别表示输入的开始和结束。地址周围的"NAME <...>"会导致Matcher忽略它可能找不到^$的潜在匹配。

答案 1 :(得分:1)

^ & $匹配String的开头和结尾(如果打开MultiLine开关,则为Line或Full文本)。如果需要从文本中提取电子邮件,可以从模式中修剪它们。

    String EMAIL_PATTERN = "^[a-zA-Z0-9][\\w.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\\w.-]*[a-zA-Z0-9]\\.[a-zA-Z][a-zA-Z.]*[a-zA-Z]$";
    String email = "NAME <firstname_lastname@domain.com>";
    Pattern pattern = Pattern.compile(EMAIL_PATTERN.substring(1, EMAIL_PATTERN.length()-1));
    Matcher matcher = pattern.matcher(email);

    if (matcher.find()) {
        System.out.println(matcher.group());
    }

<强>输出

firstname_lastname@domain.com