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

我有一个带类型的字符串,预期的结果是


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)


繁花不似锦
浏览 225回答 4
4回答

临摹微笑

您可以使用const rx = /\[(\S+)(?:\s+(.*?))?\s+<([^<>]+)>]/const strings = ['[Peter Jane Minesotta <pet.j.minn@mnu.al.edu>]','[Peter&nbsp; <pet.j.minn@mnu.al.edu>]'];for (const s of strings) {&nbsp; const [_, Fname, SecondAndRemainingNames, email] = s.match(rx);&nbsp; console.log([Fname, SecondAndRemainingNames, email]);}请参阅正则表达式演示。细节\[- 一个[字符(\S+)- 第 1 组:一个或多个非空白字符(留在 内[...],您可以改用[^\s[\]]+)(?:\s+(.*?))?- 一个由 1+ 个空格组成的可选字符串,后跟第 2 组,尽可能少地捕获除换行符以外的任何零个或多个字符(如果您想留在 内,请替换.*?为)[^[\]]*?[...]\s+- 一个或多个空格<([^<>]+)>- , 第 3 组:除and>之外的一个或多个字符,然后<>>]- 一个]字符。

蓝山帝景

您可以使用 3 种不同的正则表达式来简化问题。此外,您可以依赖字符串的结构:const input1 = "[Peter Jane Minesotta <pet.j.minn@mnu.al.edu>]"const input2 = "[Peter&nbsp; <pet.j.minn@mnu.al.edu>]"function getFName(input) {&nbsp; const name =&nbsp; input.match(/(?<=\[)\w+/);&nbsp; return name ? name[0] : '';}function getSNames(input) {&nbsp; const names =&nbsp; input.match(/(?<!\[)(?<=\s)\w+(?=\s)/g);&nbsp; return names ? names.join(' ') : '';}function getEmail(input) {&nbsp; const mail =&nbsp; input.match(/(?<=<)(?:\w|\.|@)+(?=>])/);&nbsp; return mail ? mail[0] : '';}const x = {&nbsp; name: getFName(input1),&nbsp; otherNames: getSNames(input1),&nbsp; mail: getEmail(input1)};console.log(x);const y = {&nbsp; name: getFName(input2),&nbsp; otherNames: getSNames(input2),&nbsp; mail: getEmail(input2)};console.log(y);

Smart猫小萌

这应该给你你想要的......^\[(\w+)\s(?:((?:\w+\s?)*)\s)?<(.+)>\]$第一组(\w+)将捕获第一个单词(一旦找到空间就停止),在您的情况下将是 firstName第二组(?:((?:\w+\s?)*)\s)?&nbsp;将捕获最后一个空格(在 firstName 之后)和<第一次出现之间的所有内容,您要将其保存在SecondAndRemainingNames中。注意:?在这个组的末尾使这个模式的出现成为可选的,这是你想要的,如你的第二个例子所示。最后,最后一组将捕获<和>之间的所有内容,对您来说就是电子邮件我已经用你的两个样本输入测试了这个模式,它按预期工作.. :)

梵蒂冈之花

这很好用:var all = input.match(/(^\[\w+)|(\w+ )+|<.+>/gi);var Fname = ""var SecondAndRemainingNames = ""var email = ""if (all.length == 3) {&nbsp; &nbsp; Fname = all[0];&nbsp; &nbsp; SecondAndRemainingNames = all[1];&nbsp; &nbsp; email = all[2];} else if (all.length == 2) {&nbsp; &nbsp; Fname = all[0];&nbsp; &nbsp; email = all[1];}Fname = Fname.substring(1);if (SecondAndRemainingNames != "") {&nbsp; &nbsp; SecondAndRemainingNames = SecondAndRemainingNames.trim();}email = email.substring(1).slice(0, -1);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript