Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

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

/^(?:([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)
#>> "ビーックビックビックビックカメラ"

参考もと