English help on website



*?・+?・??・{n,m}? 繰り返しマッチングでのものぐさ指定(Ver9.34対応版)
目次コマンド検索系コマンド正規表現− 繰り返しマッチングでのものぐさ指定
 「*」、「+」、「?」、「{n,m}」のような繰り返し指定は、原則として、もっとも長い文字列にマッチさせるように動作します。例えば「a*」の指定が"a"の文字が連続している文字列にヒットするとき、"a"の全体にヒットします。
 ものぐさ指定をした場合は、逆に、もっとも短い文字列にヒットしようとします。例えば「a*?」だけ指定すると、それは0文字にヒットします。

 例えば、「<」で始まって「>」で終わる文字列にヒットさせるために、「<.*>」と正規表現指定すると、それはそれで正しくヒットしますが、それだと「<AAA>CCC<BBB>」のような文字列の全体にヒットしてしまって都合が悪いです。そういう時に、ものぐさ指定して、例えば「<.*?>」のように指定すると、<AAA>の部分と<BBB>の部分の2つに分けてヒットして、とても便利です。

 また、正規表現のマッチング処理自体も、ものぐさ指定した方が動作速度が速くなる可能性が高いです。

ものぐさ指定とそうでない指定の優先順位:
 ものぐさ指定とそうでない指定を入れ子で指定した場合、基本的には外側の指定が優先されます。例えば「(a+?)+」のような指定をすると、それは「a+」と同じように、一番長い文字列にヒットします。逆に「(a+)+?」は「a+?」と同じ結果になります。{n}、{n,m}、{n,}のような繰り返し指定でも同じ法則が適用されるので、例えば「(a+?,){2}」は「+?」の指定が無視されて最大長さの文字列にヒットしますが、「(a+?,)(a+?,)」は最小長さの文字列にヒットします。ちなみに他の正規表現ライブラリは必ずしも「最大長さにヒットする」という法則じゃないらしくて、結果が違うケースがあるそうです。