使用Javascript中的正则表达式提取姓名和电子邮件

4

我有一个字符串,其中包含数据类型信息,预期结果如下:

input = "[Peter Jane Minesotta <pet.j.minn@mnu.al.edu>]"

输出

Fname = "Peter"
SecondAndRemainingNames = "Jane Minesotta"
email = "pet.j.minn@mnu.al.edu"

input = "[Peter  <pet.j.minn@mnu.al.edu>]"

输出

    Fname = "Peter"
    SecondAndRemainingNames = ""
    email = "pet.j.minn@mnu.al.edu

我需要使用正则表达式进行提取

我已经尝试过了

input.match(/\w/gim)
4个回答

6

你可以使用

const rx = /\[(\S+)(?:\s+(.*?))?\s+<([^<>]+)>]/
const strings = ['[Peter Jane Minesotta <pet.j.minn@mnu.al.edu>]','[Peter  <pet.j.minn@mnu.al.edu>]'];
for (const s of strings) {
  const [_, Fname, SecondAndRemainingNames, email] = s.match(rx);
  console.log([Fname, SecondAndRemainingNames, email]);
}

请参见正则表达式演示

详情

  • \[ - 匹配一个 [ 字符
  • (\S+) - 第一组:一个或多个非空白字符(为了保持在 [...] 中,你可以使用 [^\s[\]]+ 代替)
  • (?:\s+(.*?))? - 一个可选的字符串,由至少一个空格和第二组匹配,第二组捕获除换行符之外的零个或多个字符,尽可能少(如果要保持在 [...] 中,将 .*? 替换为 [^[\]]*?
  • \s+ - 一个或多个空格
  • <([^<>]+)> - >,第三组:一个或多个非 <> 的字符,然后是 >
  • ] - 匹配一个 ] 字符。

2

您可以使用3种不同的正则表达式来简化问题。此外,您还可以依赖字符串的结构:

const input1 = "[Peter Jane Minesotta <pet.j.minn@mnu.al.edu>]"

const input2 = "[Peter  <pet.j.minn@mnu.al.edu>]"

function getFName(input) {
  const name =  input.match(/(?<=\[)\w+/);
  return name ? name[0] : '';
}

function getSNames(input) {
  const names =  input.match(/(?<!\[)(?<=\s)\w+(?=\s)/g);
  return names ? names.join(' ') : '';
}

function getEmail(input) {
  const mail =  input.match(/(?<=<)(?:\w|\.|@)+(?=>])/);
  return mail ? mail[0] : '';
}

const x = {
  name: getFName(input1),
  otherNames: getSNames(input1),
  mail: getEmail(input1)
};

console.log(x);


const y = {
  name: getFName(input2),
  otherNames: getSNames(input2),
  mail: getEmail(input2)
};

console.log(y);


1
这应该会给你想要的东西...
^\[(\w+)\s(?:((?:\w+\s?)*)\s)?<(.+)>\]$
  1. 第一组(\w+)将捕获第一个单词(在找到空格后立即停止),在这种情况下,它将是firstName。

  2. 第二组(?:((?:\w+\s?)*)\s)?将捕获在firstName之后的最后一个空格和第一个出现的<之间的所有内容,您想将其保存在SecondAndRemainingNames中。注意:此组末尾的?使此模式的出现是可选的,这正是您希望的,如您的第二个示例所示。

  3. 最后,最后一组将捕获在<>之间的所有内容,对于您来说,这将是电子邮件。

我已经使用您的两个示例输入测试了此模式,并且效果如预期.. :)


0

这个很好用:

var all = input.match(/(^\[\w+)|(\w+ )+|<.+>/gi);
var Fname = ""
var SecondAndRemainingNames = ""
var email = ""
if (all.length == 3) {
    Fname = all[0];
    SecondAndRemainingNames = all[1];
    email = all[2];
} else if (all.length == 2) {
    Fname = all[0];
    email = all[1];
}
Fname = Fname.substring(1);
if (SecondAndRemainingNames != "") {
    SecondAndRemainingNames = SecondAndRemainingNames.trim();
}
email = email.substring(1).slice(0, -1);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接