Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

正規表現をキャプチャせずグループ化する

/^(?:([AE][0-9]{7})|(IN:\g<1>Q))$/

という正規表現に対しては

"J0125556"

"IN:E0123463Q"

という文字列がマッチします。
「(?:pat)」というグループ化しない記法で囲んでおくとキャプチャが作成されず一寸だけ性能が増します。

/^(?:([AE][0-9]{7})|(IN:\g<1>Q))$/.match("E0123463")
#=> #<MatchData "E0123463" 1:"E0123463" 2:nil>

/^(?:([AE][0-9]{7})|(IN:\g<1>Q))$/.match("IN:E0123463Q")
#=> #<MatchData "IN:E0123463Q" 1:"E0123463" 2:"IN:E0123463Q">

ちなみに、ないとこんな感じになります。

/^(([AE][0-9]{7})|(IN:\g<1>Q))$/.match("IN:E0123463Q")
#=> #<MatchData "IN:E0123463Q" 1:"IN:E0123463Q" 2:"E0123463" 3:"IN:E0123463Q">

/^(([AE][0-9]{7})|(IN:\g<1>Q))$/.match("E0123463")
#=> #<MatchData "E0123463" 1:"E0123463" 2:"E0123463" 3:nil>

このように、キャプチャするものが一個へるので性能面でも・・・というわけです

応用例:特定のパターンが連続して出る場合のグループ化

"ビーックビックビックビックカメラ" =~ /^ビーッ(?:クビッ){3}クカメラ$/ 
#>>0
Regexp.last_match
#>> #<MatchData "ビーックビックビックビックカメラ">

Regexp.last_match(1)
#>> nil

Regexp.last_match(0)
#>> "ビーックビックビックビックカメラ"

参考もと