正規表現

正規表現のグループ化は複数文字をまとめる記法 – ORにも使う

正規表現のグループ化

正規表現のグループ化とは ( )で囲う

正規表現のグループ化とは、複数の文字列をまとめて操作するための記法です。具体的には、丸括弧「( )」を使って文字列をグループ単位でまとめます。グループ化することで、直前の文字ではなく直前のグループの繰り返しとして扱えます。

// 記載する表現は「ピカ」が1回以上続いた後に「チュウ」が来る文字列
(ピカ)+チュウ

// 検索対象
ピカピカピカチュウ

// 結果
ピカピカピカチュウ

上記の例だと「(ピカ)」としてくくることで「+」にて繰り返す対象を「ピカ」の2文字に拡張しています。

下のようにグループ化をしない場合には「カ」のみが「+」の対象となるためピカチュウしかマッチしません。

// 記載する表現は「ピ」のあとに「カ」が1回以上続き「チュウ」が来る文字列
ピカ+チュウ

// 検索対象
ピカピカピカチュウ

// 結果
ピカチュウ

グループは抽出の対象になる

グループ化をすると、その中身を抽出の対象として選択できます。また、グループ化して抽出した対象は置換の際に1番目の「()」であれば「$1」、2番目の「()」であれば「$2」といった具合で置換のときに再利用が可能です。

たとえば下記の例では、前半部分の「.+」をかっこにて囲うことで任意の1文字以上の文字列を抽出の対象としています。

// 正規表現で「〜シティ」のようにシティで終わる言葉の前部分を抽出したい
(.+)シティ

// 抽出対象
マサラタウン
トキワシティ
ニビシティ
// 抽出結果
トキワ
ニビ

次の例では「(チュウ)」とすることでチュウが抽出の対象になることを活かして、置換時に「ライ$1」として「ライチュウ」となるように狙っています。「( )」で抽出した「チュウ」は置換時に「$1」として指定してあげれば「チュウ」として呼び出せます。

// 検索時の正規表現。「(チュウ)」を置換時に再利用したい
ピカ(チュウ)
// 置換時の正規表現。「(チュウ)」が「$1」で表現できているので、これを使ってライチュウとしたい
ライ$1

// 置換前
ピカチュウライチュウ
// 置換後
ライチュウライチュウ

これらの抽出や置換については次の記事でも解説しているので、チェックするとよいでしょう。

グループを抽出の対象外にするには (?:XXX)

グループ化したものの抽出の対象から外したい場合には、「(?:XXX)」のように「?:」をかっこの最初につけてあげます。こうすることでグループ化としての役割は残しつつ、抽出の対象から外せます。

// 正規表現で「〜シティ」のようにシティで終わる言葉を抽出したい
(?:.+)シティ

// 抽出対象
マサラタウン
トキワシティ
ニビシティ
// 抽出結果
トキワシティ
ニビシティ
シャワーズ

今回の例に関しては「(?:.+)シティ」としなくても「.+シティ」でやりたいことは実現できます。

グループの (XXX|YYY) はORの意味

グループ化の中で「|(パイプ)」を使えば、ORとしての意味をもたせられます。たとえば「(XXX|YYY)」とすると「XXX」か「YYY」のどちかにヒットするように表現できます。

たとえば次のようにかくことで「ピカチュウ」と「ライチュウ」の両方にヒットするようになります。

// 正規表現で「ピカチュウ」「ライチュウ」にヒットさせたい
(ピカ|ライ)チュウ

// 検索対象の文字列
ピカチュウ
ライチュウ
ピチュー

// ヒットする文字列
ピカチュウ
ライチュウ
シャワーズ

「(ピカ|ライ)チュウ」は「(?:ピカ|ライ)チュウ」としたほうが余計な抽出を回避できます。ここは便宜上「(ピカ|ライ)チュウ」で説明しました

正規表現OR条件については次の記事で解説しているので、詳しく知りたい方はこちらもあわせてチェックしてください。

一文字のORは[ABC]で表現

一文字だけでOR条件を示したいのであれば文字クラスの「[ ]」を使うほうが適しています。「 | 」を使わずとも複数の候補を設定できるので気軽に使えます。

たとえば次のパターンはサシスセソタチツテトのいずれかのみで構成された名前を調べようとしています。「(サシスセソタチツテト)」としてしまうと「サシスセソタチツテト」そのものを含む文字列を探してしまうので注意しましょう。

// 正規表現にてカタカナのサ行とタ行のみを使っている一文字を以上を抽出したい
^[サシスセソタチツテト]+$

// 検索対象の文字列
サトシ
タケシ
カスミ

// ヒットする文字列
サトシ