浜松のWEBシステム開発・スマートフォンアプリ開発・RTK-GNSS関連の開発はお任せください
株式会社シーポイントラボ
TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:静岡県浜松市中区富塚町1933-1 佐鳴湖パークタウンサウス2F

正規表現の最短一致指定子としての”?”

 正規表現には”*”、”+”、”{m,n}”などの様な繰り返しの量指定子があります。これら量指定子はそのままの場合、最長のマッチになるようにマッチングを行います。具体的には下図です。
 
 ”(a+)(a+)”で文字列”aaaaa”をマッチさせました。m[1]にはグループ1である最初のカッコの”a+”にマッチしたaが、m[2]にはグループ2である二つ目のカッコの”a+”にマッチしたaが、格納されています。最長のマッチになる様にマッチングを行う、というのは、”m[1]=aaaa”とあるようにマッチ全体が成立する範囲でできる限り多くの文字列を含もうとする動作のことです。正規表現全体のマッチが成立しなくなるまで、マッチングを続けるとも言えます。逆に最短になるようにマッチを行う方法もあり、その指定子が”?”です。”*?”や”+?”の様に繰り返し指定子の直後に”?”をつけることで最短マッチになります。最短マッチの例が下図です。
 
 ”(a+?)(a+)”で文字列”aaaaa”をマッチさせました。先ほど同様にm[1]、m[2]にそれぞれのグループが格納されています。今度は”m[1]=a”とあります。最短になるようなマッチです。この場合、繰り返し指定子がマッチしたらすぐにマッチングを終了するという動作になります。そのため”a+”が成立する”a”一文字でグループ1の部分のマッチングが終了しました。
 最短一致指定子が有効なのは例えばタグの様な特定の文字で括られたものの検索です。”<.*?>“とした場合、<の次に初めて>が出た時点でマッチングを終了してくれます。逆にダメなパターンでありがちなのは”$”や”\z”の様な行末指定です。頻繁にマッチ終了と行末か否かの判断が繰り返されて実行時間が遅くなります。

  • この記事いいね! (0)