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