Regexp不起作用

时间:2013-11-01 17:42:18

标签: java regex

我想将以下正则表达式应用于字符串。它与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();
    }
}

3 个答案:

答案 0 :(得分: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);

\\bword boundary,这是您想要的,而不是"^""$",表示开头分别以结尾

请注意,我的capturing groups与您的character classes不同。之前,您正在捕获"@""[dot]"等。现在正在捕获“用户名”,“域名”和“顶级域名”,这就是我认为你想要的。

注意:您无需转义here中的特殊字符,即[.]表示句点,[\\.]是不必要的。它仍然可以正常工作,因为您需要\\\\来实际匹配\,{{3}}解释。

答案 1 :(得分: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);

答案 2 :(得分:0)

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

matches("(?i)\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b");