【问题标题】:Could not match myname@myemail.edu.in in Java在 Java 中无法匹配 myname@myemail.edu.in
【发布时间】:2013-10-19 11:02:42
【问题描述】:

我正在尝试使用以下正则表达式匹配字符串 m-y_n.ame@myemail.edu.in:

    ([_A-Za-z0-9-.]+@[a-z0-9-]+[.][a-z]{2,3}[.][a-z]{2,3})

完整的正则表达式为:

   ([-A-Za-z0-9._!#$%^&*|{}'~`]+@[a-z0-9_-]+[\\.][a-z]{2,3}[\\.][a-z]{2,3})|([A-Za-z0-9.!#$%^&*|{}\"~`]+@[a-z0-9_-]+[\\.][a-z]{4})|([A-Z.a-z0-9!#$%^&*|{}'~`]+@[a-z0-9_-]+[\\.][a-z]{3})|([A-Za-z0-9.!#$%^&*_-|{}'~`]+@[a-z0-9_-]+[\\.][a-z]{2})

我需要对正则表达式进行哪些更改才能匹配指定的模式?

这些是我的一些测试用例:

 1.vamsi$deepak0@gmail.com
 2.v_a_m_s_i_d_e_e_p_a_k_0_3@gmail.com
 3.v-a-m_si.deepak@gmail.com
 4.vamsi$deepak03@gmail.co.in
 5.v_a_m_s_i_d_e_e_p_a_k_0_3@gmail.co.in
 6.v-a-m_si.deepak@gmail.co.in
 7.vamsideepask03@bits-pilani.edu
 8.vams-ideep_ask03@bits-pilani.edu
 9.vamsi-d_.eepak03@gmool.biz
 10.songs@gaana.in
 11.vamsideep_-.ak03@footfall.net
 12.jackspa_-.rrow@pirates.org
 13.nomorespaceshuttles@nasa.gov
 The most scary test case seems to be  
 14.vamsideepak@gmail.iovamsideepak@gmail.comvamsideepak0@gmail.co.invamsideepak@gmail.info

我当前使用的正则表达式匹配

    vamsideepak@gmail.iova,msideepak@gmail.comv

以此类推。如果我将使用的表达式的顺序反转为匹配 . 之后字符数较少的表达式,则会导致反转匹配值:

    vamsideepak@gmail.io,vamsideepak@gmail.co

等等。

我应该怎么做才能确保与案例 14 正确匹配。我应该分别使用这些组中的每一个进行验证吗?

【问题讨论】:

标签: java regex email


【解决方案1】:

下面函数中的正则表达式匹配 myname@myemail.edu.in,同时防止无效电子邮件。例如,它可以防止电子邮件地址中的相邻句点(如 my..name@myemail.edu.in)根据 RFC 822 是无效的。

public static boolean isValidEmail(String email) {
    return email.matches("\\A[a-z0-9]+([-._][a-z0-9]+)*@([a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,4}\\z")
        && email.matches("^(?=.{1,64}@.{4,64}$)(?=.{6,100}$).*");
}

validate email address using regular expression in Java

【讨论】:

  • 请查看案例14。这种情况发生的可能性并不小。我可以修改我正在使用的表达式以匹配案例14,因为我的字符串很大而且非常不规则。我希望我能像你一样匹配电子邮件。
  • 另外,我知道 gov.in 是有效的,所以它是有效的 [\.][az]{2,3}[\.][az]{2}。
  • 对于案例 14,您需要在电子邮件地址之间使用某种分隔符,否则几乎不可能正确匹配字符串。我提供的正则表达式应该能够验证 gov.in
【解决方案2】:

这应该适合你:

[A-Za-z0-9!#$%&’*+-/=?^_`\.{|}~]+@([a-z0-9_-]+[\.]?)*

【讨论】:

  • 在 rubular 和 regexplanet 上对其进行测试后,我发现它只能识别到域名的电子邮件。我也可以使用 [.] 而不是 [\.]。还有一件事,我想从同一个字符串中提取多封电子邮件,我不能隐式信任我的来源。
  • 我遇到了一个问题,myname@myemail.comyourname@youremail.com 是字符串的一部分。在这种情况下我该怎么办?
猜你喜欢
  • 2019-03-13
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
  • 2015-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多