【问题标题】:Grouping with OR in regex在正则表达式中使用 OR 分组
【发布时间】:2013-11-16 15:20:05
【问题描述】:

以下是我的正则表达式模式。我正在使用它来验证电子邮件地址。

^[\\w]+(\\.|\\_)?[\\w]+\\@{1}[\\w]+\\.{1}(([A-Za-z]+)|(\\.{1}[A-Za-z]+))$

电子邮件 ID 必须遵循以下规则。
1. 在 1 个句点或下划线之前包含任意数量的字母或数字。
2. 1个@前跟任意数量的字母或数字。
3. 1 个句点前后跟任意数量的字母或数字。
4.(后跟任意数量的字母)或(1个句点和任意数量的字母)。

我遇到了第四条规则的问题。它适用于以 @xyz.abc 结尾的电子邮件 ID,但不适用于 @xyz.abc.ab

难道不能像我做的那样为第四条规则分组模式吗?

解决方案:

"^[A-Za-z0-9]+[\\._][A-Za-z0-9]+@[A-Za-z0-9]+(?:\\.[A-Za-z]+){1,2}$"

【问题讨论】:

  • 将规则 4 修改为“后跟任意数量的句点组,后跟字母”,这相当于原始要求,但更容易编写正则表达式。我在下面的答案中包含了正确的正则表达式。
  • 可以按照您的做法对第四条规则的模式进行分组,但生成的正则表达式会很丑陋。下面的两个答案都有更简单的正则表达式。

标签: java regex


【解决方案1】:

根据你的描述,你想要的其实是:

^[A-Za-z0-9]+[\\._][A-Za-z0-9]+@[A-Za-z0-9]+(?:\\.[A-Za-z]+)+$

拆分出来,你有:

  1. 字母或数字 ([A-Za-z0-9]+)
  2. 下划线或句点 ([\\._])
  3. 字母或数字 ([A-Za-z0-9]+)
  4. 签名 (@)
  5. 字母或数字 ([A-Za-z0-9]+)
  6. 一个或多个句点加字母 ((?:\\.[A-Za-z]+)+)

注意\\w包含_,所以这里不能使用。

【讨论】:

  • 这不满足规则 3,即允许在句点之前和 @ 符号之后使用字母或数字。
  • 感谢您指出 \\w 包含 _。我不得不将最后一个 + 替换为 {1,2} 以将出现次数限制为 2 次。我已经发布了答案以及我的问题。感谢您的帮助。
【解决方案2】:

使用这个:

^[\\w]+(\\.|\\_)?[\\w]+\\@{1}[\\w]+(\\.{1}[\\w]+)+$

我还应该指出,电子邮件的实际正则表达式非常复杂。我希望您没有将它用于网站上的任何真实检查。

【讨论】:

  • 这是否满足您的要求?正则表达式中存在语法错误,我已在更新中更正。
  • 正如 Russell 所指出的,\\w 允许使用下划线。我已经发布了解决方案。谢谢你的帮助。
  • 您可以将您的正则表达式缩短为:^\\w+(\\.)?\\w+@\\w+(\\.\\w+)+$
猜你喜欢
  • 1970-01-01
  • 2012-07-17
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 2021-08-08
  • 2012-10-30
  • 2019-07-16
  • 1970-01-01
相关资源
最近更新 更多