4 回答

TA貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個(gè)贊
您可以使用
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]);
}
請(qǐng)參閱正則表達(dá)式演示。
細(xì)節(jié)
\[
- 一個(gè)[
字符(\S+)
- 第 1 組:一個(gè)或多個(gè)非空白字符(留在 內(nèi)[...]
,您可以改用[^\s[\]]+
)(?:\s+(.*?))?
- 一個(gè)由 1+ 個(gè)空格組成的可選字符串,后跟第 2 組,盡可能少地捕獲除換行符以外的任何零個(gè)或多個(gè)字符(如果您想留在 內(nèi),請(qǐng)?zhí)鎿Q.*?
為)[^[\]]*?
[...]
\s+
- 一個(gè)或多個(gè)空格<([^<>]+)>
- , 第 3 組:除and>
之外的一個(gè)或多個(gè)字符,然后<
>
>
]
- 一個(gè)]
字符。

TA貢獻(xiàn)1843條經(jīng)驗(yàn) 獲得超7個(gè)贊
您可以使用 3 種不同的正則表達(dá)式來(lái)簡(jiǎn)化問題。此外,您可以依賴字符串的結(jié)構(gòu):
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貢獻(xiàn)1911條經(jīng)驗(yàn) 獲得超7個(gè)贊
這應(yīng)該給你你想要的......
^\[(\w+)\s(?:((?:\w+\s?)*)\s)?<(.+)>\]$
第一組(\w+)將捕獲第一個(gè)單詞(一旦找到空間就停止),在您的情況下將是 firstName
第二組(?:((?:\w+\s?)*)\s)? 將捕獲最后一個(gè)空格(在 firstName 之后)和<第一次出現(xiàn)之間的所有內(nèi)容,您要將其保存在SecondAndRemainingNames中。注意:?在這個(gè)組的末尾使這個(gè)模式的出現(xiàn)成為可選的,這是你想要的,如你的第二個(gè)例子所示。
最后,最后一組將捕獲<和>之間的所有內(nèi)容,對(duì)您來(lái)說(shuō)就是電子郵件
我已經(jīng)用你的兩個(gè)樣本輸入測(cè)試了這個(gè)模式,它按預(yù)期工作.. :)

TA貢獻(xiàn)1900條經(jīng)驗(yàn) 獲得超5個(gè)贊
這很好用:
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);
添加回答
舉報(bào)