单行电子邮件正则表达式有效,但多行版本无效

Posted

技术标签:

【中文标题】单行电子邮件正则表达式有效,但多行版本无效【英文标题】:One-line email regex works but multi-line version doesn't 【发布时间】:2017-04-08 08:10:21 【问题描述】:

我发现this 正则表达式用于电子邮件。我试图把它变成一个多行版本。但是在我这样做之后它就停止工作了:

const emailOne = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]1,3\.[0-9]1,3\.[0-9]1,3\.[0-9]1,3])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]2,))$/

const email = RegExp(
  /* eslint-disable */
  '^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|' +
  '(".+"))@((\[[0-9]1,3\.[0-9]1,3\.[0-9]1,3\.[0-9]1,3])|' +
  '(([a-zA-Z\-0-9]+\.)+[a-zA-Z]2,))$'
  /* eslint-enable */
)

emailOne.test('abc@gmail.com')

emailTwo.test('abc@gmail.com')

emailOne 返回trueemailTwo 返回false。为什么会是这个原因?

编辑:

我意识到RegExp 修改了原来的正则表达式(破坏了它):

// regex created by RegExp
/^(([^<>()[]\.,;:s@"]+(.[^<>()[]\.,;:s@"]+)*)|(".+"))@(([[0-9]1,3.[0-9]1,3.[0-9]1,3.[0-9]1,3])|(([a-zA-Z-0-9]+.)+[a-zA-Z]2,))$/

// emailOne
/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]1,3\.[0-9]1,3\.[0-9]1,3\.[0-9]1,3])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]2,))$/

【问题讨论】:

@Pang 修正了答案。 “单行电子邮件正则表达式有效”不,它没有。您的正则表达式排除了大量完全有效的电子邮件地址。 ***.com/a/201378/362536 这是一个先前的问题,询问与似乎相同的正则表达式相同的问题。 ***.com/questions/12317049/… 接受的答案应该满足您的需求。 @Brad 这是第一个弹出的 Google 结果。我包含了链接。 @alex 验证电子邮件地址的最安全方法是发送一封请求用户操作的电子邮件。 【参考方案1】:

您的第一个正则表达式是用正则表达式指定的。你的第二个是用字符串指定的,你忽略了用另一个反斜杠转义反斜杠。 \\

【讨论】:

以上是关于单行电子邮件正则表达式有效,但多行版本无效的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式匹配注释(单行或多行)并匹配其他所有内容(C#)

注释的正则表达式,但不在“字符串”内/不在另一个容器中

Html 正则表达式模式: [\d\s-]3 有效,但 [\d-\s]3 无效。为啥?

Sublime Text 正则表达式未检测到多行标签

当正则表达式有效且在其他地方工作时,带有“m”标志的 Javascript 正则表达式错误、“无效的正则表达式组”

正则表达式