正規表現で論理演算子 "AND"を使用したいと思います。 は、私はこれを試してみました:論理演算子ANDとPHP正規表現
(?=exp1)(?=exp2)
しかし、PHP ?=
では動作し、PHP言語での私のプログラムを記述する必要はありません。別の方法がありますか?すべての条件が存在し、任意の順序で存在する場合、式は一致しなければなりません。
(exp1)(exp2)(exp3)|(exp1)(exp3)(exp2)|....
正規表現で論理演算子 "AND"を使用したいと思います。 は、私はこれを試してみました:論理演算子ANDとPHP正規表現
(?=exp1)(?=exp2)
しかし、PHP ?=
では動作し、PHP言語での私のプログラムを記述する必要はありません。別の方法がありますか?すべての条件が存在し、任意の順序で存在する場合、式は一致しなければなりません。
(exp1)(exp2)(exp3)|(exp1)(exp3)(exp2)|....
PHPは先読み式をサポートしています: 私のようなすべての順列を書きたくありません。あなたはおそらくそれらを正しく使用していないでしょう。
あなたがfoo
、bar
とbaz
の3つすべてを含む文字列を一致させたいと仮定すると、あなたは正規表現を必要とする
^(?=.*foo)(?=.*bar)(?=.*baz)
これは、しかし、その試合を文字列foobarbaz
またはbarbazfoo
などの一致を返します。先読みは文字を消費しないため、空の文字列になります。あなたは正規表現が文字列自体を返すようにしたい場合は、それはすべての3つの基準を満たすならば、文字列全体にマッチします
^(?=.*foo)(?=.*bar)(?=.*baz).*
を使用しています。
私は単に
if (preg_match('/^(?=.*foo)(?=.*bar)(?=.*baz)/s', $subject)) {
# Successful match
} else {
# Match attempt failed
}
が、これがまたfoonly bartender bazooka
のような文字列にマッチしますのでご注意ください使用します。あなたは(だけの3つの式のそれぞれの純粋な順列を許可する)ことをしたくない場合は、ちょっとしたトリックでそれを行うことができます。
^(?:foo()|bar()|baz()){3}\1\2\3$
試合foobarbaz
、foobazbar
、barfoobaz
、barbazfoo
、bazfoobar
とbazbarfoo
(何もありません)。 "トリック"は、Jan GoyvaertsとSteven Levithanの優れた本"Regular Expressions Cookbook"(p。304)に触発されています。次のように動作する:
foo
等)が必要な部分が一致した場合に常に一致する空のキャプチャグループ()
が続きます。foobarbar
の場合、(?:foo()|bar()|baz()){3}
の部分は一致しますが、\3
は失敗し、正規表現全体が失敗します。\1\2\3
は文字列の最後で一致します。 @ティムの答えに加えて:
(?=exp1)(?=exp2)
これが本当であることはできません。あなたは普通の英語で言う:ここに続くテキストがexp1であることを確認し、ここに続くテキストがexp2であることを確認する。これは真実ではありません。それは決して一致しません。
正規表現を分割する必要があると思います – DiogoDoreto
うーむ。 phpは '(?= ...)'をサポートしています:http://php.net/manual/en/regexp.reference.assertions.php –