モヒカンは正義

渋谷で働く怪しいWebエンジニアの生きた証と備忘録

正規表現 "?:" の意味 #些細な検証メモ

f:id:pinkumohikan:20170611155505j:plain

正規表現って構文が色々あって、読むごとに学びがありますよね。 今回は “?:” っていう構文について調べたので、備忘録がてらメモっときます

(写真は昨日の夜に行った 七志 とんこつ編 渋谷道玄坂店 です)

正規表現 “?:” の意味

MSDNによると、

(?:pattern) pattern と一致しても、その文字列は記憶されず、後で使用することはできません。"or" を意味する (|) を使用してパターンの一部を結合するときに便利です。たとえば、'industry|industries' と指定する代わりに、'industr(?:y|ies)‘ と指定する方が簡単です。

https://msdn.microsoft.com/ja-jp/library/cc392020.aspx

とのこと

要は、「 () のようにマッチングには使えるが、マッチした文字列の情報を保持しないよ」っていう表現ですね

“?:” は、どういう時に使うのか?

  • メモリを節約したいとき
  • この部分は要らない、っていうのを読んだ人に伝えたいとき

たとえば

Gmailメールアドレスから、エイリアスの部分を除く文字列を取得したいとき、何も考えないと下記のような表現になると思います

([a-zA-Z0-9-\.]+)(\+[a-zA-Z0-9-\.]+)?@gmail\.com

↑に対して example+aaa@gmail.com っていう文字列を与えると、example+aaa の2つがマッチング結果になります。 欲しかったのは example だけなので +aaa は余計です。

こういう時に “?:” を使って下記のように書くと example だけを求められます。

([a-zA-Z0-9-\.]+)(?:\+[a-zA-Z0-9-\.]+)?@gmail\.com