我需要正则表达式中的逻辑与。
就像是
杰克和詹姆斯
同意以下字符串
“嗨, 杰克 ,我是 詹姆斯 ”
‘嗨 詹姆斯 ,这里是 杰克 ‘
您可以使用 积极的前瞻 来进行检查。以下是不可或缺的regular-expressions.info的摘要:
Lookahead 和lookbehind,统称为“ookaround”,是零长度断言......lookaround 实际上匹配字符,但随后放弃匹配,只返回结果:匹配或不匹配。这就是为什么它们被称为“ssertions”。它们不消耗字符串中的字符,而只是断言匹配是否可能。
然后它继续解释肯定的前瞻用于 断言 后面的内容与某个表达式匹配,而不 占用 该匹配表达式中的字符。
因此,这是一个表达式,它使用两个后续的后置前瞻来断言该短语匹配jack并且james以任一顺序:
jack
james
^(?=.*\bjack\b)(?=.*\bjames\b).*$
测试一下。
括号中以开头的表达式?=是正向预测。我将分解模式:
?=
^
(?=.*\bjack\b)
.*\bjack\b
.*
\b
$
因此,第一个前瞻表示“后面的内容(并且本身不是前瞻或后瞻)必须是一个表达式,该表达式以零个或多个字符开头,后跟一个单词边界,然后是jack另一个单词边界,”第二个前瞻说“接下来必须是一个表达式,它以零个或多个任意字符开头,后跟一个单词边界,然后是james另一个单词边界。” 在两个前瞻之后,.*它简单地匹配任何字符零次或多次,$并且匹配表达式的结尾。
“从任何东西开始,然后是 jack 或 james,然后以任何东西结束”满足第一个前瞻,因为有许多字符,然后是单词jack,它满足第二个前瞻,因为有许多字符(恰好包括jack,但是这不是满足第二个前瞻的必要条件)然后是单词james。前瞻都不断言表达式的结尾,因此后面的.*可以超出满足前瞻的内容,例如“然后以任何结尾”。
我想你明白了,但要绝对清楚,这里是 withjack和jamesreversed,即“从任何东西开始,然后是 james 或 jack,然后以任何东西结束”;它满足第一个前瞻,因为有许多字符,然后是单词james,它满足第二个前瞻,因为有许多字符(恰好包括james,但这不是满足第二个前瞻所必需的)然后词jack。和以前一样,前瞻都不断言表达式的结尾,因此后面的.*可以超越满足前瞻的内容,例如“然后以任何东西结束”。
这种方法的优点是您可以轻松指定多个条件。
^(?=.*\bjack\b)(?=.*\bjames\b)(?=.*\bjason\b)(?=.*\bjules\b).*$