2

我想将以下正则表达式应用于字符串。它在 Grant Skinners Regexr 上运行良好,在http://www.regexplanet.com/advanced/java/index.html(区分大小写)上也运行良好,但 Java 不会接受它。它从来没有遇到过while循环。这是我的代码:

public static void main(String args[]) {
   final String testString =
      "lorem upsadsad asda 12esadas test@test.com asdlawaljkads test[at]test" +
      "[dot]com test jasdsa meter";
   final Pattern ptr =
      Pattern.compile(
         "^[A-Z0-9\\._%+-]+(@|\\s*\\[\\s*at\\s*\\]\\s*)[A-Z0-9\\.-]+" +
         "(\\.|\\s*\\[\\s*dot\\s*\\]\\s*)[a-z]{2,6}$",
         Pattern.CASE_INSENSITIVE);

    try {
        final Matcher mat = ptr.matcher(testString);
        while (mat.find()) {
            final String group1 = mat.group(1);
            System.out.println(group1);
            final String group2 = mat.group(2);
            System.out.println(group2);
            final String group3 = mat.group(3);
            System.out.println(group3);
        }
    } catch (final Exception e) {
        e.printStackTrace();
    }
}
4

3 回答 3

2

不需要复杂的正则表达式。正如另一位用户建议的那样,"[dot]"".""[at]"替换"@",即:

myAddressLine = myAddressLine.replace("[dot]", ".").replace("[at]","@");

现在,我们可以将您的正则表达式简化为:

Pattern.compile(
"\\b([a-z0-9._%+-]+)@([a-z0-9.-]+)\\.([a-z]{2,6})\\b", Pattern.CASE_INSENSITIVE);

\\b是一个单词边界,这就是你想要的,而不是"^""$"指示分别以 开头结尾

请注意,我的捕获组与您的不同。之前,您正在捕获"@"等等"[dot]"。现在正在捕获“用户名”、“域”和“顶级域”,这就是我假设你想要的。

注意:您不需要转义字符类中的特殊字符,即[.]表示句点,[\\.]是不必要的。它仍然可以正常工作,因为您需要\\\\实际匹配 a \,这在此处进行了解释。

于 2013-11-01T18:20:00.140 回答
0

为了简化您的正则表达式,我将首先将 [at] 和 [dot] 替换为实际字符。然后只需使用标准的电子邮件正则表达式,例如:

matches("(?i)\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b");
于 2013-11-01T18:05:24.790 回答
0
final Pattern ptr = Pattern.compile(
    "\\b([A-Z0-9\\._%+-]+)"+
    "(?:@|\\s*\\[\\s*at\\s*\\]\\s*)"+
    "([A-Z0-9\\.-]+)"+
    "(?:\\.|\\s*\\[\\s*dot\\s*\\]\\s*)"+
    "([a-z]{2,6})\\b", Pattern.CASE_INSENSITIVE);
于 2013-11-01T18:00:52.183 回答