我需要逻辑和在正则表达式。
类似的
杰克和詹姆斯
同意以下字符串
'嗨,杰克,我是詹姆斯' '嗨,詹姆斯,我是杰克'
我需要逻辑和在正则表达式。
类似的
杰克和詹姆斯
同意以下字符串
'嗨,杰克,我是詹姆斯' '嗨,詹姆斯,我是杰克'
当前回答
Try:
james.*jack
如果你同时想要两者,那么:
james.*jack|jack.*james
其他回答
你可以使用regex的量词特性,因为不一定总是支持查找。
(\bjames\b){1,}.*(\bjack\b){1,}|(\bjack\b){1,}.*(\bjames\b){1,}
这个答案中的表达式对一个杰克和一个詹姆斯的任何顺序都是如此。
在这里,我们将探索其他场景。
方法一:一个杰克,一个詹姆斯
以防万一,两个jack或两个james是不允许的,只有一个jack和一个james是有效的,我们可以设计一个类似这样的表达式:
^(?!.*\bjack\b.*\bjack\b)(?!.*\bjames\b.*\bjames\b)(?=.*\bjames\b)(?=.*\bjack\b).*$
在这里,我们将使用以下语句排除这些实例:
(?!.*\bjack\b.*\bjack\b)
and,
(?!.*\bjames\b.*\bjames\b)
RegEx演示1
我们还可以将其简化为:
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$
RegEx演示2
如果您希望简化/更新/探索表达式,regex101.com的右上方面板中有解释。如果您感兴趣,可以在这个调试器链接中查看匹配的步骤或修改它们。调试器演示了RegEx引擎如何一步一步地使用一些示例输入字符串并执行匹配过程。
RegEx电路
jex。Im可视化正则表达式:
Test
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}`); }); }
方法二:一个杰克,一个詹姆斯,按特定顺序
这个表达式也可以设计为先a james后a jack,类似于下面这个:
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b.*\bjack\b).*$
RegEx演示3
反之亦然:
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjack\b.*\bjames\b).*$
RegEx演示4
Vim有一个分支操作符\&,在以任何顺序搜索包含一组单词的行时非常有用。此外,扩展所需的单词集是微不足道的。
例如,
/ *杰克\ &。*詹姆斯
将以任意顺序匹配包含jack和james的行。
有关用法的更多信息,请参阅这个答案。我不知道有任何其他实现分支的正则表达式;这个运算符甚至没有在正则表达式维基百科条目中被记录。
它又短又甜
(?=.*jack)(?=.*james)
测试用例:
[ “xxx James xxx jack xxx”, “jack XXX James”, “jack XXX jam”, “果酱和杰克”, “杰克”, “詹姆斯”, ] .forEach (s = > console.log(/(? =。*詹姆斯)(? =。*杰克)/ test (s)))
我要写的命令说明:-
. 表示任何字符、数字都可以代替。
*表示零次或多次在它前面写的东西。
|表示“或”。
So,
james.*jack
会搜索詹姆斯,然后任意数量的角色,直到杰克出现。
既然你想要任何一个杰克。詹姆斯还是詹姆斯,杰克
于是命令:
jack.*james|james.*jack