2

a* は 0 個以上の a を意味します。

文字列「abbabba」には、abba が 2 回出現しています。(abba)bba と abb(abba)。preg_match_all は、最初の出現のみに一致します。

正規表現の基本の基本が欠けていますか?

$string = 'abbabba';

preg_match_all("/ab*a/", $string, $matches);

print_r($matches);

Array ( [0] => Array ( [0] => abba ) ) 
4

5 に答える 5

5

パターンで指定された正規表現に一致するすべての対象を検索し、フラグで指定された順序でそれらを一致に入れます。

最初の一致が見つかった後、後続の検索は最後の一致の終わりから続行されます。

ソース

于 2012-07-21T11:21:12.520 に答える
3

ab*aテキストを消費するため。これは、パーサーが最初に出現したものと一致し、パターンと一致せずabbaに から再度開始することを意味します。bba

于 2012-07-21T11:23:30.450 に答える
3

解決策:先読みアサーションをキャプチャ グループと共に使用します。

preg_match_all('/(?=(ab*a))/', $subject, $result, PREG_PATTERN_ORDER);
$result = $result[1];
于 2012-07-21T11:28:14.193 に答える
2

出現回数を見つけるには、次のようにします。

preg_match_all('/(?=ab*a)/', $input, $result); 
print(count($result[0]));

一致を見つけるには、次を使用します。

preg_match_all('/(?=(ab*a))/', $input, $result); 
print_r($result[1]);
于 2012-07-21T11:42:41.540 に答える
2

*貪欲な検索を示します。エンジンはb*、文字列の最後まで一致し、 に到達するまで後方に移動するbことを確認すると、その時点までの一致した文字列がパターンと一致するかどうかを確認します。

最初にa、すぐに実行する に一致するように見えます。次に、文字列内で最初の a の後に がb*最後に出現するまで文字列と一致することを確認し (これは、b が「欲張りに」一致する必要があることを示すため)、この時点で本質的に一致することを意味します。次に、一致を成功させるには別の文字と一致させる必要があることがわかります。そのため、次の文字である を取得し、パターンに一致しない残りを残して完了します。お役に立てれば。b*abbaabba

オメガが言ったことを実行すれば、壮大な勝利を収めることができます。

于 2012-07-21T11:28:49.397 に答える