小编典典

正则表达式以任何顺序匹配包含两个名称的字符串

all

我需要正则表达式中的逻辑与。

就像是

杰克和詹姆斯

同意以下字符串

  • “嗨, 杰克 ,我是 詹姆斯

  • ‘嗨 詹姆斯 ,这里是 杰克


阅读 45

收藏
2022-05-18

共1个答案

小编典典

您可以使用 积极的前瞻 来进行检查。以下是不可或缺的regular-expressions.info的摘要:

Lookahead 和lookbehind,统称为“ookaround”,是零长度断言......lookaround
实际上匹配字符,但随后放弃匹配,只返回结果:匹配或不匹配。这就是为什么它们被称为“ssertions”。它们不消耗字符串中的字符,而只是断言匹配是否可能。

然后它继续解释肯定的前瞻用于 断言 后面的内容与某个表达式匹配,而不 占用 该匹配表达式中的字符。

因此,这是一个表达式,它使用两个后续的后置前瞻来断言该短语匹配jack并且james以任一顺序:

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

测试一下。

括号中以开头的表达式?=是正向预测。我将分解模式:

  1. ^断言要匹配的表达式的开头。
  2. (?=.*\bjack\b)是第一个肯定的前瞻,说后面的内容必须匹配.*\bjack\b
  3. .*表示任何字符零次或多次。
  4. \b表示任何单词边界(空格、表达式开头、表达式结尾等)。
  5. jack字面上是连续的四个字符(james在下一个正向前瞻中相同)。
  6. $断言表达式的结尾对我匹配。

因此,第一个前瞻表示“后面的内容(并且本身不是前瞻或后瞻)必须是一个表达式,该表达式以零个或多个字符开头,后跟一个单词边界,然后是jack另一个单词边界,”第二个前瞻说“接下来必须是一个表达式,它以零个或多个任意字符开头,后跟一个单词边界,然后是james另一个单词边界。”
在两个前瞻之后,.*它简单地匹配任何字符零次或多次,$并且匹配表达式的结尾。

“从任何东西开始,然后是 jack 或
james,然后以任何东西结束”满足第一个前瞻,因为有许多字符,然后是单词jack,它满足第二个前瞻,因为有许多字符(恰好包括jack,但是这不是满足第二个前瞻的必要条件)然后是单词james。前瞻都不断言表达式的结尾,因此后面的.*可以超出满足前瞻的内容,例如“然后以任何结尾”。

我想你明白了,但要绝对清楚,这里是 withjackjamesreversed,即“从任何东西开始,然后是 james 或
jack,然后以任何东西结束”;它满足第一个前瞻,因为有许多字符,然后是单词james,它满足第二个前瞻,因为有许多字符(恰好包括james,但这不是满足第二个前瞻所必需的)然后词jack。和以前一样,前瞻都不断言表达式的结尾,因此后面的.*可以超越满足前瞻的内容,例如“然后以任何东西结束”。

这种方法的优点是您可以轻松指定多个条件。

^(?=.*\bjack\b)(?=.*\bjames\b)(?=.*\bjason\b)(?=.*\bjules\b).*$
2022-05-18