正規表現のメモ|自分用
●●● Windows環境再構築中につき、記事が工事中 ●●●
■ 正規表現における量指定子と使用例(基本パターン + 最小マッチ)
【1】+
:1回以上の繰り返し(貪欲)
- 正規表現:
a+
- 対象文字列:
aaab
- マッチ結果:
aaa
👉a
が1回以上続く部分を、できる限り多くマッチします。
【2】*
:0回以上の繰り返し(貪欲)
- 正規表現:
a*
- 対象文字列:
aaab
- マッチ結果:
aaa
👉a
が0回以上繰り返される部分にマッチ。何もない部分にもマッチ可能。
【3】?
:0回または1回の繰り返し
- 正規表現:
a?
- 対象文字列:
aaab
- マッチ結果(全体検索時):
a
,a
,a
,""
(空文字) 👉 各位置においてa
が1つあればマッチ。なければ空でもマッチします。
【4】{n}
:ちょうどn回の繰り返し
- 正規表現:
a{3}
- 対象文字列:
aaabaaa
- マッチ結果:
aaa
👉a
がちょうど3回連続している部分にのみマッチ。
【5】{m,n}
:m回以上、n回以下の繰り返し
- 正規表現:
a{2,4}
- 対象文字列:
aaaaab
- マッチ結果:
aaaa
(貪欲なので最大限マッチ)
【5-1】{,n}
:0回以上、n回以下の繰り返し({0,n}
と同義)
- 正規表現:
a{,2}
- 対象文字列:
aaa
- マッチ結果(全体検索時):
aa
,a
【5-2】{m,}
:m回以上の繰り返し
- 正規表現:
a{2,}
- 対象文字列:
aaaaa
- マッチ結果:
aaaaa
■ 最小マッチ(非貪欲)指定付きの量指定子と使用例
〔1〕+?
:1回以上、できるだけ少なくマッチ
- 正規表現:
a+?
- 対象文字列:
aaab
- マッチ結果(全体検索時):
a
,a
,a
👉 貪欲だと1回でaaa
にマッチするが、最小マッチでは1文字ずつ分割されます。
〔2〕*?
:0回以上、できるだけ少なくマッチ
- 正規表現:
a*?
- 対象文字列:
aaab
- マッチ結果(全体検索時):
""
,""
,""
,""
,""
(5つ) 👉a
を0回で済ませるのが最小なので、すべての位置で空文字にマッチ。
〔3〕??
:0回または1回、できるだけマッチしない
- 正規表現:
a??
- 対象文字列:
aaab
- マッチ結果(全体検索時):
""
,""
,""
,""
,""
(5つ) 👉 貪欲なa?
ならa
にマッチするが、a??
は空文字優先。
〔4〕{n}?
:ちょうどn回(※最小マッチの意味はない)
- 正規表現:
a{3}?
- 対象文字列:
aaab
- マッチ結果:
aaa
👉{3}
は「ちょうど3回」なので、最小/最大の概念は関係ない。?
は無意味。
〔5〕{m,n}?
:m回以上n回以下、できるだけ少なくマッチ
- 正規表現:
a{2,4}?
- 対象文字列:
aaaaa
- マッチ結果:
aa
👉a
を2〜4回の間で、最小(2回)だけマッチ。
〔5-1〕{,n}?
:0回以上n回以下、できるだけ少なくマッチ
- 正規表現:
a{,3}?
- 対象文字列:
aaaaa
- マッチ結果(全体検索時):
""
,""
, … 👉 最小なので0回でマッチする位置が優先される。
〔5-2〕{m,}?
:m回以上、できるだけ少なくマッチ
- 正規表現:
a{2,}?
- 対象文字列:
aaaaa
- マッチ結果:
aa
👉a
が2回以上の中で**最小(2回)**だけマッチ。
✅ 最後にポイントまとめ:
{n}?
は構文的には正しいが、意味が変わらないため非実用的。- 実際の処理や抽出で「最小限に抑えたい」場合は、
+?
、*?
、{m,n}?
を多用。 - パターンの設計では、データの構造(区切り文字・境界など)と合わせて使うことが重要。
必要に応じて、これらの正規表現を含むコード(Python、JavaScriptなど)やツール(例:grep、VS Codeの検索)での活用例も紹介できます。どの環境で使う予定ですか?