2017-02-08 23 views
1

は、次の例を考えてみ有効なデータをスキップ実際の結果は正規表現複数行モードでは

です
"ababaaabbb =%=" 
"ababaaabbb =%=" 

が、予想これが起こるのはなぜ

"ababaaabbb =%=" 
"ababaaabbb =%=" 
"ababaa  " 

のですか?グループ(?:=%=)??のためオプションであり、ペイロードの最後の文字列も一致結果に存在する必要があります。

+1

オプションのグループの中に行のアンカーの末尾を置いてください。 '(?:=%= $)? ' –

+0

ああ、動作します!しかし、どのように?複数行モードの '' $ '' 'は' \ nまたはEOL 'の前にあるので、 "=%="のオプション部分は無効ですが、文字列 "ababaa =%" '' $ '' 'で到達することもできますし、最後に" \ n "を置くこともできます。 – Alex

+0

オプションのグループが失敗したとき(私の提案された変更で)、パターンは行末に到達する必要はなく、スペースがなければ最後のスペースまたは最後のaまたはbで停止します。 –

答えて

1

は、現在の正規表現のグラフを見てください:

enter image description here

=%=white spaceEnd of lineフォークの間にどのように枝を参照)、オプションですが、EOL 必要です。つまり、1つまたは複数のaまたはbの記号の後にを意味し、ゼロ個以上の空白がある場合は、EOLがでなければなりません。しかし、あなたの3行目=> NO MATCHに=%があります。今

、オプションのグループに$アンカーを移動するとき:

enter image description here

行の最後には、あまりにも、今オプションで、試合は1+ aかを照合した後に返却されますb文字とオプションの空白。

+0

ありがとう、素晴らしい説明! – Alex

+0

:)「見ているのは信じている」 –

0

最後の行が=%で終了しているので、あなたにも最後の=オプション作り、あなたの予想データのキャプチャグループを使用する必要があります。

/^([ab]+\s*)(?:=%=?)?$/m 

RegEx Demo

PS:あなたの予想結果は捕捉されたグループ#1で利用可能

+0

期待される結果の最後の行を見てください。 –

+0

いいえ。 '' '=%=' ''のみであるか、何もマッチする必要がないからです。 – Alex

+0

あなたの最後の行は '=%'で終わります。なぜその行は期待される結果に含まれていますか? – anubhava

0

グループ(?:=%=)?は、あなたの正規表現ではオプションです。そのではありません。そのグループの各部分もまたオプションです。

あなたの正規表現は、それがその後、a sおよびb秒の文字列、オプションの空白、どちらか(1)=%=とラインまたはラインの(2)だけで終わりの終わりを見ている場合にのみ機能します。 abの文字列、空白、正確には=%=以外の文字列、または行の終わりが表示されている場合は機能しません。したがって、=%は動作しません。あなたは明らかに何をしたい達成するために

は、あなたがそうのように、第二=をオプションにする必要があります。

$pattern = '/^[ab]+\s*(?:=%=?)?$/m'; 
// see the additional ? here^ 

しかし、あなたは、このシナリオでは、すべてので=%を望んでいないように思えます、意味あなたはまだ、より創造的な取得する必要があります。

$pattern = '/^[ab]+\s*(?:(?:=%=)?$|(?==%$))/m'; 

Demo

+0

私の場合、オプションの部分は '' =%= '' '' =% '' '' '' '' '' 'で、何もありません。私はあなたに驚いています。「 '' a''と '' b''sの文字列、空白文字、そして正確に=%=以外の文字列、または行の終わりを見るとうまくいかないでしょう"。私は、オプションのグループが一致しない場合、EOLで "スキップ"されたものが '' $ ''でマッチすると、 "aabb =%"のような文字列がすべて一致すると考えました。 – Alex

+0

また、行の最後に '='だけを許可したい場合は、2番目の例を '$ pattern = '/^[ab] + \ s *(?:(?:=%=)に変更しますか? $(?==%?$))/ m '; '('? 'に'% 'の後に気づく)オプションのグループ*は一致しない場合はスキップされますが、パターン全体が一致しなければなりません。オプションのグループをあなたの正規表現から削除し、 '/^[ab] + \ s * $/m'を残したとします。空白と行末の間に何か( '=%')があるので、 'ababaa =%'と一致しません。 –