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).*$