正規表現のメモ|自分用
●●● 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の検索)での活用例も紹介できます。どの環境で使う予定ですか?