【问题标题】:Java Regex X{n,m} X, at least n but not more than m timesJava Regex X{n,m} X,至少 n 次但不超过 m 次
【发布时间】:2014-12-12 12:00:42
【问题描述】:

我正在尝试了解如何将电子邮件地址与以下模式匹配:

      myEmail@something.any

any 应介于 2,4 个字符之间。

请在下面找到 Java 代码。我不明白为什么它返回true。谢谢!

public static void main(String[] args){

        String a = "daniel@gmail.com";
        String b = "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.+-]+.[a-zA-Z]{2,4}";
        String c = "MyNameis1@abcx.comfff";
        Boolean b1 = c.matches(b);
        System.out.println(b1);
    }

输出:真

【问题讨论】:

  • 我猜这个问题已经被其他人解决了。如果您遇到困难,请在 Google 上搜索解决方案,并确保您理解它。
  • 您的正则表达式仅检查最后一个点之后是否至少有 2 到 4 个字符。它没有说明不应再有字符。您需要将 [a-zA-Z]{2,4} 定义为当前行的结尾。

标签: java regex


【解决方案1】:

在正则表达式中,. 匹配任何字符(换行符除外)。如果你想从字面上匹配.,你需要转义它:

[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.+-]+\\.[a-zA-Z]{2,4}

这更好,但它仍然匹配MyNameis1@abcx.comf 部分。我们可以添加一个字符串结尾锚 ($) 以确保没有尾随的不匹配字符:

[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.+-]+\\.[a-zA-Z]{2,4}$

【讨论】:

  • 最后你不需要$。默认情况下,Java String.matches 在两端锚定。
  • @nhahtdh 不错,不知道。不过,我宁愿保留它以保持一致性。
【解决方案2】:

String b = "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.+-]+.[a-zA-Z]{2,4}"; 中转义.。它是正则表达式中的特殊字符。

使用:String b = "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.+-]+\\.[a-zA-Z]{2,4}";

【讨论】:

    【解决方案3】:

    在您的表达中,点表示任何字符。逃避它并确保没有字符跟随发布您的最小/最大字符检查,如下所示:

    [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.+-]+\\.[a-zA-Z]{2,4}$
    

    【讨论】: