如何用正则表达式捕获以“Email:”开头行中的邮箱地址?
解决捕获邮箱地址的正则问题
原正则的问题
你写的/Email\:(.*)\1/g存在两个关键错误:
- 错误使用反向引用:
\1是用来引用之前捕获组的内容,但你在定义捕获组(.*)后立刻引用,此时捕获组还未匹配到任何内容,导致(.*)只能匹配空字符串,最终仅能捕获到Email:。 - 未处理冒号后的空格:原文本中
Email:后面带有空格,你的正则未考虑这个细节,无法正确定位邮箱的起始位置。
正确的正则方案
方案1:匹配整行邮箱内容(适配你的场景)
由于邮箱在单独一行,直接匹配Email:后面的所有内容即可:
const text = `Details of Contact Made: Sender's Name: Test (Individual) Mobile: 4354354354 Email: 7c92e312-93d5-4354354-45435435@email.webhook.site Message: I am interested in your property. Please get in touch with me Click here <https://www.magicbricks.com/bricks/mailerautologin.html?`; const regex = /Email:\s*(.+)/; const match = text.match(regex); const email = match ? match[1] : ''; // 最终得到目标邮箱
Email:匹配固定前缀\s*匹配冒号后0个或多个空格(兼容可能的空格差异)(.+)捕获该行剩余的所有内容(即目标邮箱地址)
方案2:精准匹配邮箱格式(更严谨)
如果需要确保捕获的是标准邮箱格式,可以使用专门的邮箱正则:
const regex = /Email:\s*([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})/; const match = text.match(regex); const email = match ? match[1] : '';
这个正则会严格匹配@、域名后缀等邮箱特征,避免意外捕获其他无关内容。
注意事项
- 不要添加
g全局标志:全局模式下match只会返回所有匹配的完整结果,不会返回捕获组。如果需要全局匹配多个邮箱,改用exec循环获取。
内容的提问来源于stack exchange,提问作者Code Guy
相关产品推荐
相关产品推荐

