正则表达式匹配任何顺序包含两个名称的字符串

时间:2010-12-08 16:13:34

标签: regex string

我需要正则表达式中的逻辑AND。

类似

杰克和詹姆斯

同意以下字符串

  • 'hi jack 这里 james '

  • '嗨詹姆斯这里杰克'

8 个答案:

答案 0 :(得分:207)

您可以使用lookarounds进行检查:

^(?=.*\bjack\b)(?=.*\bjames\b).*$

Test it.

这种方法的优点是可以轻松指定多个条件。

^(?=.*\bjack\b)(?=.*\bjames\b)(?=.*\bjason\b)(?=.*\bjules\b).*$

答案 1 :(得分:76)

尝试:

james.*jack

如果你想要两个同时,那么or他们:

james.*jack|jack.*james

答案 2 :(得分:34)

我要写的命令的解释: -

.表示任何字符,数字都可代替。

*表示在它之前写入的事物零次或多次出现。

|表示'或'

所以,

james.*jack

会搜索james,然后搜索任意数量的字符,直到jack来。

由于您需要jack.*jamesjames.*jack

因此 命令

jack.*james|james.*jack

答案 3 :(得分:6)

你可以这样做:

\bjack\b.*\bjames\b|\bjames\b.*\bjack\b

答案 4 :(得分:3)

由于不一定一直支持lookaround,因此可以使用正则表达式的量化器功能。

(\bjames\b){1,}.*(\bjack\b){1,}|(\bjack\b){1,}.*(\bjames\b){1,}

答案 5 :(得分:2)

它简短而甜美

(?=.*jack)(?=.*james)

答案 6 :(得分:0)

Vim具有分支运算符\&,当搜索包含任何顺序的一组单词的行时,该运算符很有用。而且,扩展所需单词的集合是微不足道的。

例如,

/.*jack\&.*james

将以任意顺序匹配包含jackjames的行。

有关使用的更多信息,请参见this answer。我不知道任何其他实现分支的正则表达式。 Regular Expression维基百科条目上甚至都没有记录该操作员。

答案 7 :(得分:0)

方法1:一个jack和一个james

以防万一,不允许两个jack或两个james,只有一个jack和一个james有效,我们可以设计一个类似的表达式到:

^(?!.*\bjack\b.*\bjack\b)(?!.*\bjames\b.*\bjames\b)(?=.*\bjames\b)(?=.*\bjack\b).*$

在这里,我们将使用以下语句排除那些配对实例:

(?!.*\bjack\b.*\bjack\b)

(?!.*\bjames\b.*\bjames\b)

RegEx Demo 1

我们也可以简化为

^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$

RegEx Demo 2


如果您希望简化/修改/探索表达式,请在regex101.com的右上角进行说明。如果愿意,您还可以在this link中查看它如何与某些示例输入匹配。


RegEx电路

jex.im可视化正则表达式:

enter image description here

测试

const regex = /^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$/gm;
const str = `hi jack here is james
hi james here is jack
hi james jack here is jack james
hi jack james here is james jack
hi jack jack here is jack james
hi james james here is james jack
hi jack jack jack here is james
`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}


方法2:1 jack和1 james按特定顺序

也可以为第一个james最后一个jack设计,类似于以下内容:

^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b.*\bjack\b).*$

RegEx Demo 3

,反之亦然:

^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjack\b.*\bjames\b).*$

RegEx Demo 4