平々凡々エンジニア

平凡で難しい悩みを解決

グループ化はするがキャプチャしない「:?」はわざわざ使用して可読性を下げてまで行う必要があるか?

f:id:ceratophrysgerogero:20200304105130j:plain オライリー正規表現から引用

 括弧の中の部分式にマッチしたテキストはキャプチャされ、$2に格納される。そして、ここではこの変数を使わない。グループ化には使えるが、使うつもりのない変数へのテキストの格納というオーバーヘッドのない(そして混乱を起こす危険性もない)括弧のタイプがあれば、もっとよくなるのではないのだろうか。  Perlなどの新しい正規表現は、そのための方法を提供している。グループ化してキャプチャする「(…)」ではなく、「(?:…)」という特殊な記法を使えば、グループ化はするがキャプチャはしない。  この方法によって得られるものは2つある。1つは、不要なキャプチャを避けることによってマッチ処理の効率が上がることだ。もう1つは、それぞれの目的のために必要なタイプの括弧を使えば、後でコードを読む人を混乱させずに、コードの意味をはっきり伝えられるということだ。目的にかかわらず同じ括弧が使われていたら、どういう意味で括弧が使われているのか迷うことになるだろう。  しかし、「(?:…)」という記法はちょっと不恰好だし、正規表現を一目で把握するということではかえってマイナスになっているのではないかとも考えられる。得られるメリットは。このコストに見合うものだろうか。私自身は、必要なタイプの括弧を正確に使うのを好む方だが、この例に限っては、わざわざ混乱を招く必要はないように感じる。たとえば、マッチは1回だけなので(ループで繰り返し行われているわけではないので)、効率が本当に問題になるようなケースではない。  この章では、キャプチャが不要な場合でも、見た目がすっきりしている「(…)」をつかっていくことにする。

ということなので(:?)は使わなくてもいい。ただしパフォーマンスを気にする必要が出た時はグループ化するがキャプチャしない方法(?:)があることを覚えておこう。

参考資料:キャプチャしない正規表現は()にする・・・って、え?