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>
之外的一个或多个字符,然后<
>
>
]
- 一个]
字符。
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);
TA贡献1911条经验 获得超7个赞
这应该给你你想要的......
^\[(\w+)\s(?:((?:\w+\s?)*)\s)?<(.+)>\]$
第一组(\w+)将捕获第一个单词(一旦找到空间就停止),在您的情况下将是 firstName
第二组(?:((?:\w+\s?)*)\s)? 将捕获最后一个空格(在 firstName 之后)和<第一次出现之间的所有内容,您要将其保存在SecondAndRemainingNames中。注意:?在这个组的末尾使这个模式的出现成为可选的,这是你想要的,如你的第二个例子所示。
最后,最后一组将捕获<和>之间的所有内容,对您来说就是电子邮件
我已经用你的两个样本输入测试了这个模式,它按预期工作.. :)
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);
添加回答
举报