我需要正则表达式中的逻辑AND。
类似
杰克和詹姆斯
同意以下字符串
'hi jack 这里 james '
'嗨詹姆斯这里杰克'
答案 0 :(得分:207)
您可以使用lookarounds进行检查:
^(?=.*\bjack\b)(?=.*\bjames\b).*$
这种方法的优点是可以轻松指定多个条件。
^(?=.*\bjack\b)(?=.*\bjames\b)(?=.*\bjason\b)(?=.*\bjules\b).*$
答案 1 :(得分:76)
尝试:
james.*jack
如果你想要两个同时,那么or
他们:
james.*jack|jack.*james
答案 2 :(得分:34)
我要写的命令的解释: -
.
表示任何字符,数字都可代替。
*
表示在它之前写入的事物零次或多次出现。
|
表示'或'。
所以,
james.*jack
会搜索james
,然后搜索任意数量的字符,直到jack
来。
由于您需要jack.*james
或james.*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
将以任意顺序匹配包含jack
和james
的行。
有关使用的更多信息,请参见this answer。我不知道任何其他实现分支的正则表达式。 Regular Expression维基百科条目上甚至都没有记录该操作员。
答案 7 :(得分:0)
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)
我们也可以简化为
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$
如果您希望简化/修改/探索表达式,请在regex101.com的右上角进行说明。如果愿意,您还可以在this link中查看它如何与某些示例输入匹配。
jex.im可视化正则表达式:
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}`);
});
}
jack
和1 james
按特定顺序也可以为第一个james
最后一个jack
设计,类似于以下内容:
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b.*\bjack\b).*$
,反之亦然:
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjack\b.*\bjames\b).*$