为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁花不似锦 2023-06-15 09:42:42
我有一个带类型的字符串,预期的结果是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 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

您可以使用


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+)- 第 1 组:一个或多个非空白字符(留在 内[...],您可以改用[^\s[\]]+

  • (?:\s+(.*?))?- 一个由 1+ 个空格组成的可选字符串,后跟第 2 组,尽可能少地捕获除换行符以外的任何零个或多个字符(如果您想留在 内,请替换.*?为)[^[\]]*?[...]

  • \s+- 一个或多个空格

  • <([^<>]+)>- , 第 3 组:除and>之外的一个或多个字符,然后<>>

  • ]- 一个]字符。


查看完整回答
反对 回复 2023-06-15
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

您可以使用 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);


查看完整回答
反对 回复 2023-06-15
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

这应该给你你想要的......

^\[(\w+)\s(?:((?:\w+\s?)*)\s)?<(.+)>\]$
  1. 第一组(\w+)将捕获第一个单词(一旦找到空间就停止),在您的情况下将是 firstName

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

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

我已经用你的两个样本输入测试了这个模式,它按预期工作.. :)


查看完整回答
反对 回复 2023-06-15
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

这很好用:


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);


查看完整回答
反对 回复 2023-06-15
  • 4 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信