我目前有一个正则表达式
/^Newsletter pour (.+)?<?((([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,}))>?$/i
我希望它匹配
Newsletter pour ome <[email protected]>
和Newsletter pour [email protected]
。现在我做了类似regex.exec('Newsletter pour [email protected]')的操作,想检测电子邮件是否在数组的位置1或2。但是问题在于,有时电子邮件的第一个字母被放入索引1,其余部分被放入索引2。
请帮忙。我该如何纠正
最佳答案
您的正则表达式太长,可以很简单地进行操作。尝试/^Newsletter pour (?:\s*(\w+(?: \w+)*) )?<?((\S+)@(([^.]+)\.[^>]+))>?\s*$/i
,除了第一个以外,重置是相同的2:email,3:username,4:host,5:whois。
describe('matching address', () => {
const regex = /^Newsletter pour (?:\s*(\w+(?: \w+)*) )?<?((\S+)@(([^.]+)\.[^>]+))>?\s*$/i;
test('address without header', () => {
let result = "Newsletter pour [email protected]".match(regex);
expect(result[1]).toBeUndefined();
expect(result[2]).toEqual('[email protected]');
expect(result[3]).toEqual('ome');
expect(result[4]).toEqual('yahoo.com');
expect(result[5]).toEqual('yahoo');
});
test('email without sharps', () => {
let result = "Newsletter pour ome [email protected]".match(regex);
expect(result[1]).toEqual('ome');
expect(result[2]).toEqual('[email protected]');
});
test('email enclosed with sharps', () => {
let result = "Newsletter pour ome <[email protected]>".match(regex);
expect(result[1]).toEqual('ome');
expect(result[2]).toEqual('[email protected]');
});
test('header includes whitespaces', () => {
let result = "Newsletter pour ome sanni john [email protected]".match(regex);
expect(result[1]).toEqual('ome sanni john');
expect(result[2]).toEqual('[email protected]');
});
test('header includes whitespaces & email eclosed with sharps', () => {
let result = "Newsletter pour ome sanni john <[email protected]>".match(regex);
expect(result[1]).toEqual('ome sanni john');
expect(result[2]).toEqual('[email protected]');
});
});