正则表达式匹配在@符号之前没有一些单词的字符串

Regex to match a string which does NOT have some words before @ symbol

如果字符串中的字符 @ 之前存在某些单词,我想丢弃该字符串。

示例: 我希望单词 foobar 应该 NOT 出现在@符号之前的字符串中,但在@符号之后允许使用相同的单词。

我不想要这些:

abcfooxyz@domain.com

barabc@domain.com

barabc@domainfoo.com

我想要这些:

abcxyz@domainfoo.com

pqrabc@domainbar.com

pqrabc@domain.com


我有正则表达式 ^((?!(foo|bar)).)*$,但它也会丢弃在 @ 符号之后具有 foobar 的字符串,即使在 @.

之前不存在单词也是如此

我只希望它在字符串中 @ 符号之前出现 foobar 时丢弃。


你知道我该怎么做吗? 谢谢。

您需要在 @ 之前的每个字符位置断言它不是 foobar 的开头:

^((?!foo|bar).)+@.*$

Demo on regex101

你可以试试这个:

^(?!.*(?:foo|bar).*@).*?@.*$

解释: 一个简单且单一的否定前瞻,以确保 foo 或 bar 在 @ 之前不存在。因为它是单向预测所以它运行得更快。

Demo

示例来源:

const regex = /^(?!.*(?:foo|bar).*@).*?@.*$/gm;

const str = `I do NOT want these:
abcfooxyz@domain.com
barabc@domain.com
barabc@domainfoo.com
I want these:
abcxyz@domainfoo.com
pqrabc@domainbar.com
pqrabc@domain.com`;
let m;

while ((m = regex.exec(str)) !== null) {
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    m.forEach((match, groupIndex) => {
        console.log(`${match}`);
    });
}