Answers:
您可以使用环顾四周进行检查:
^(?=.*\bjack\b)(?=.*\bjames\b).*$
这种方法的优点是您可以轻松指定多个条件。
^(?=.*\bjack\b)(?=.*\bjames\b)(?=.*\bjason\b)(?=.*\bjules\b).*$
vim语法:^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$或\v^(.*<jack>)@=(.*<james>)@=.*$
^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$无法匹配,blah #tgif blah #friday blah但^(?=.*\bfriday\b)(?=.*\btgif\b).*$效果很好。
\b意思?
尝试:
james.*jack
如果您同时想要两者,则or它们:
james.*jack|jack.*james
james.*?jack|jack.*?james。这将有助于大文本。
我要编写的命令说明:-
. 表示任何字符,数字都可以代替。
* 表示零个或多个出现在其之前的事物。
|表示“或”。
所以,
james.*jack
将搜索james ,然后输入任意数量的字符,直到jack出现。
既然你想要jack.*james或者james.*jack
因此命令:
jack.*james|james.*jack
它简短而甜美
(?=.*jack)(?=.*james)
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的右上方面板中进行说明。如果愿意,您还可以在此链接中观看,它将如何与某些示例输入匹配。
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和一个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).*$