2

正規表現でOR演算子を使用できることはわかっています。

$str = "Here is a strawhat, some cranberry, and a strawberry!";
while($str =~ /(\bstraw\B|\Bberry\b)/g) {
  print "Thanks for the $& !\n";
}

ORの代わりにANDを使用するwhileループ以外の簡単で短い方法があります。そのため、一致するのは「イチゴ」だけですか。

つまり、指定されたすべての正規表現に一致するサブストリングが文字列に存在するかどうかを確認する必要があります。

4

1 に答える 1

4

私があなたの質問を正しく理解している場合は、これに先読みアサーションを使用できます。

if ($str =~ /^(?=.*?regexp-1)(?=.*?regexp-2)...(?=.*?regexp-n)/s) {
    # $str matches regexp-1, regexp-2, ..., regexp-n.
}

この構造には、いくつかの前提条件が組み込まれています。

  • すべての部分式は整形式です。
  • どの部分式も、.「改行以外の任意の文字」を意味するメタ文字を使用していません。必要に応じて、この動作をオンに戻すことができます(?-s:...)
于 2012-08-17T22:35:24.853 に答える