我目前有一个正则表达式

/^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]');
    });
});

09-25 17:17