我需要逻辑和在正则表达式。

类似的

杰克和詹姆斯

同意以下字符串

'嗨,杰克,我是詹姆斯' '嗨,詹姆斯,我是杰克'


当前回答

你可以使用regex的量词特性,因为不一定总是支持查找。

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

其他回答

我要写的命令说明:-

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

*表示零次或多次在它前面写的东西。

|表示“或”。

So,

james.*jack

会搜索詹姆斯,然后任意数量的角色,直到杰克出现。

既然你想要任何一个杰克。詹姆斯还是詹姆斯,杰克

于是命令:

jack.*james|james.*jack

Try:

james.*jack

如果你同时想要两者,那么:

james.*jack|jack.*james

它又短又甜

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

测试用例:

[ “xxx James xxx jack xxx”, “jack XXX James”, “jack XXX jam”, “果酱和杰克”, “杰克”, “詹姆斯”, ] .forEach (s = > console.log(/(? =。*詹姆斯)(? =。*杰克)/ test (s)))

你可以:

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

不需要两个lookhead,一个子字符串可以正常匹配。

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

在regex101上查看这个演示

查找是零长度断言(条件)。这里的forward在^ start处检查是否jack出现在字符串的后面,如果成功则匹配到james和.*其余部分(可以删除)。Lazy dot用于单词之前(包含在\b单词边界中)。使用i标志来忽略大小写。