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

类似的

杰克和詹姆斯

同意以下字符串

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


当前回答

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

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

在regex101上查看这个演示

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

其他回答

Try:

james.*jack

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

james.*jack|jack.*james

你可以:

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

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

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

Vim有一个分支操作符\&,在以任何顺序搜索包含一组单词的行时非常有用。此外,扩展所需的单词集是微不足道的。

例如,

/ *杰克\ &。*詹姆斯

将以任意顺序匹配包含jack和james的行。

有关用法的更多信息,请参阅这个答案。我不知道有任何其他实现分支的正则表达式;这个运算符甚至没有在正则表达式维基百科条目中被记录。

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

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

在regex101上查看这个演示

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