正则表达式 - 在电子邮件地址之间提取文本

时间:2017-02-10 12:02:33

标签: regex

从下面的文字中我需要提取电子邮件和名称。

Vicente Clark
vicente.clark@gmail.com
Mark van der Zant
mark.zant@protonmail.com
Georgy Collins
georgy.collins@yahoo.com
Paul Danilsson
paul.danilsson@live.com

我已经找到了电子邮件部分,但我需要将这些名称存储在一个单独的变量中。

使用新行可能无法很好地格式化文本。

1 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式:

(?:^|\r?\n)(.*?)\r?\n(.*?@.*?)(?=\r?\n|$)
  • (?:)一个不匹配的群组(否则这将是第一个$1
  • ^|\r?\n换行符(Windows \r\n或UNIX \n)或字符串的开头(第一个条目的开头没有换行符)
  • (.*?)任何内容,但尽可能少的字符(直到下一个换行符)
  • (.*?@.*?)与电子邮件地址匹配,但除了必须包含@字符外,不进行任何验证
  • (?=\r?\n|$)模式必须跟\r?\n|$后面,但它不匹配(这是必要的,否则,之后的换行符已经是这场比赛的一部分,因此不能成为下一场比赛)。 \r?\n|$匹配换行符或字符串结尾。
  • 确保使用全局标记来匹配多个出现(最后/g

如果文本“并不总是使用换行符进行格式化”,则需要提供有关其结构的更多信息。正则表达式依赖于固定模式,需要单独处理每种可能性。

以下是JavaScript中的示例:

var text = document.getElementById('main').innerHTML;
var regex = /(?:^|\r?\n)(.*?)\r?\n(.*?@.*?)(?=\r?\n|$)/g;

var match = regex.exec(text);
while(match !== null) {
  console.log(match[1] + ":", match[2]);
  match = regex.exec(text);
}
#main {
  white-space: pre;
  font-family: monospace;
}
<div id="main">Vicente Clark
vicente.clark@gmail.com
Mark van der Zant
mark.zant@protonmail.com
Georgy Collins
georgy.collins@yahoo.com
Paul Danilsson
paul.danilsson@live.com</div>