preg_match()での正規表現における繰り返しの最大回数について
PHPのpreg_match()で正規表現でパターンマッチを行う際に、{,}のカギ括弧とカンマで文字列の比較を繰り返し行うことができる。
これを正規表現に対応したテキストエディタと同じ感覚で利用していたのだが、その際に少しだけ頭を捻ったことがあった。
それが、繰り返し回数の最大についてだ。
英数字をパターンマッチさせる時に、
$string = 'Abc123456789'; if ( preg_match( '/^[A-Za-z0-9]{0,99999}+$/', $string ) ) { // 処理A } else { // 処理B }
とかやっていたんだけど、これだとどうも常にelseの条件を通ってしまう。
そもそも、preg_match()は正規表現の判定の際に、preg_match()そのものでエラーが発生した場合はBOOLEAN値のfalseを返す。
ず~っと前に読んでいたPHPの公式ドキュメンテーションで、マッチした場合は1、マッチしなかった場合は0、そして前述のBOOLEAN値を返すということは一応知っていたので、そのせいでelseの条件を通ることはわかったのだが・・・。
なぜ、エラーしているのだろうか。
おかしいと思って、正規表現のループ回数を最大999とかにしてみると、問題なく動く。
そして、そこで気づいたのが、PHPの正規表現関係の関数にはループに設定できる最大の回数があるのではないかということ。
思えば、自分はこのパターンマッチを利用する際に、過去を遡っても覚えている範囲では最大でも2048回とかにしかしたことがない。
そこで、公式ドキュメンテーションを再度調べてみると、こんな記述を発見した。
汎用の量指定子 (general repetition quantifier) は、波カッコの中に 2 つの数をカンマで区切って記述したもので、マッチ可能な 最小と最大の繰り返し数を指定します。ただし、65536 以上の数は 指定できません。さらに、最初の数は 2 番目の数以下である必要があります。
※PCRE 正規表現構文 > 繰り返しより抜粋
やっぱり最大値があった。
preg_match()に関わらず、多分、preg_replace()とかも同じ仕様。
これ関係の関数で正規表現で繰り返しを行う場合は、65535回が設定できる最大である。
正規表現はよく使うのでよく覚えておくことにしよう・・・(´・ω・`)