逻辑运算符AND与php正则表达式


Logical operator AND with php regular expression

我想在正则表达式中使用一种逻辑运算符"AND"。我试过这个:

(?=exp1)(?=exp2)

但在PHP中?=不起作用,需要用PHP语言编写程序。还有其他方法吗?如果存在所有条件,则表达式必须匹配。我不想把每个排列都写成:

(exp1)(exp2)(exp3)|(exp1)(exp3)(exp2)|....

PHP确实支持前瞻表达式。不过,您可能没有正确使用它们。

假设您想要匹配一个包含foobarbaz这三个字符串,则需要regex

^(?=.*foo)(?=.*bar)(?=.*baz)

这将返回字符串foobarbazbarbazfoo等的匹配项。但是,该匹配项将是空字符串(因为lookahead不使用任何字符(。如果您希望正则表达式返回字符串本身,请使用

^(?=.*foo)(?=.*bar)(?=.*baz).*

如果它满足所有三个标准,那么它将匹配整个字符串。

我会简单地使用

if (preg_match('/^(?=.*foo)(?=.*bar)(?=.*baz)/s', $subject)) {
    # Successful match
} else {
    # Match attempt failed
}

请注意,这也将匹配类似foonly bartender bazooka的字符串。如果你不想这样(只允许三个表达式中每一个的纯排列(,你可以用一个小技巧:

^(?:foo()|bar()|baz()){3}'1'2'3$

匹配foobarbazfoobazbarbarfoobazbarbazfoobazfoobarbazbarfoo(没有其他内容(。这个"窍门"的灵感来源于Jan Goyvaerts和Steven Levitan的优秀著作《正则表达式食谱》(第304页(。它的工作原理如下:

  • 每个所需部分(foo等(之后是空的捕获组(),如果所需部分已经匹配,则该捕获组总是匹配的
  • 因此,如果所有三个必需部分都匹配,那么所有三个空捕获组都匹配
  • 只有当每个捕获组都参与了比赛时,以下反向引用才会成功
  • 因此,如果字符串是foobarbar,则部分(?:foo()|bar()|baz()){3}将匹配,但'3失败,因此整个regex失败
  • 然而,如果这三个组都参与了匹配,'1'2'3会在字符串末尾成功匹配,因为每个捕获组只包含空字符串

除了@Tim的回答:

(?=exp1)(?=exp2)

这不可能是真的。你用通俗的英语说:确保后面的文本是exp1,也确保后面的是exp2。这绝不是真的。它永远不会匹配。