は、次の例を考えてみ有効なデータをスキップ実際の結果は正規表現複数行モードでは
です"ababaaabbb =%="
"ababaaabbb =%="
が、予想これが起こるのはなぜ
"ababaaabbb =%="
"ababaaabbb =%="
"ababaa "
のですか?グループ(?:=%=)?
は?
のためオプションであり、ペイロードの最後の文字列も一致結果に存在する必要があります。
は、次の例を考えてみ有効なデータをスキップ実際の結果は正規表現複数行モードでは
です"ababaaabbb =%="
"ababaaabbb =%="
が、予想これが起こるのはなぜ
"ababaaabbb =%="
"ababaaabbb =%="
"ababaa "
のですか?グループ(?:=%=)?
は?
のためオプションであり、ペイロードの最後の文字列も一致結果に存在する必要があります。
は、現在の正規表現のグラフを見てください:
=%=
を(white space
とEnd of line
フォークの間にどのように枝を参照)、オプションですが、EOL が必要です。つまり、1つまたは複数のa
またはb
の記号の後にを意味し、ゼロ個以上の空白がある場合は、EOLがでなければなりません。しかし、あなたの3行目=> NO MATCHに=%
があります。今
、オプションのグループに$
アンカーを移動するとき:
行の最後には、あまりにも、今オプションで、試合は1+ a
かを照合した後に返却されますb
文字とオプションの空白。
ありがとう、素晴らしい説明! – Alex
:)「見ているのは信じている」 –
最後の行が=%
で終了しているので、あなたにも最後の=
オプション作り、あなたの予想データのキャプチャグループを使用する必要があります。
/^([ab]+\s*)(?:=%=?)?$/m
PS:あなたの予想結果は捕捉されたグループ#1で利用可能
グループ(?:=%=)?
は、あなたの正規表現ではオプションです。そのはではありません。そのグループの各部分もまたオプションです。
あなたの正規表現は、それがその後、a
sおよびb
秒の文字列、オプションの空白、どちらか(1)=%=
とラインまたはラインの(2)だけで終わりの終わりを見ている場合にのみ機能します。 a
とb
の文字列、空白、正確には=%=
以外の文字列、または行の終わりが表示されている場合は機能しません。したがって、=%
は動作しません。あなたは明らかに何をしたい達成するために
は、あなたがそうのように、第二=
をオプションにする必要があります。
$pattern = '/^[ab]+\s*(?:=%=?)?$/m';
// see the additional ? here^
しかし、あなたは、このシナリオでは、すべてので=%
を望んでいないように思えます、意味あなたはまだ、より創造的な取得する必要があります。
$pattern = '/^[ab]+\s*(?:(?:=%=)?$|(?==%$))/m';
Demo。
私の場合、オプションの部分は '' =%= '' '' =% '' '' '' '' '' 'で、何もありません。私はあなたに驚いています。「 '' a''と '' b''sの文字列、空白文字、そして正確に=%=以外の文字列、または行の終わりを見るとうまくいかないでしょう"。私は、オプションのグループが一致しない場合、EOLで "スキップ"されたものが '' $ ''でマッチすると、 "aabb =%"のような文字列がすべて一致すると考えました。 – Alex
また、行の最後に '='だけを許可したい場合は、2番目の例を '$ pattern = '/^[ab] + \ s *(?:(?:=%=)に変更しますか? $(?==%?$))/ m '; '('? 'に'% 'の後に気づく)オプションのグループ*は一致しない場合はスキップされますが、パターン全体が一致しなければなりません。オプションのグループをあなたの正規表現から削除し、 '/^[ab] + \ s * $/m'を残したとします。空白と行末の間に何か( '=%')があるので、 'ababaa =%'と一致しません。 –
オプションのグループの中に行のアンカーの末尾を置いてください。 '(?:=%= $)? ' –
ああ、動作します!しかし、どのように?複数行モードの '' $ '' 'は' \ nまたはEOL 'の前にあるので、 "=%="のオプション部分は無効ですが、文字列 "ababaa =%" '' $ '' 'で到達することもできますし、最後に" \ n "を置くこともできます。 – Alex
オプションのグループが失敗したとき(私の提案された変更で)、パターンは行末に到達する必要はなく、スペースがなければ最後のスペースまたは最後のaまたはbで停止します。 –