MIFES 11

正規表現のメモ|自分用

●●● 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でのマッチ結果〔全体検索時〕:bbabaa 👉aが0回でもマッチするため、bの直後にaが【あってもなくても】=【0回以上であるなら】bにマッチする〔aが0回〕。bの後にaが1回ならba、2回ならbaaと、aが続く分だけマッチする。
  • bxyzbaが0回〕
  • baxyzbaaが1回〕
  • baaxyzbaaaが2回〕

【3】?:0回または1回の繰り返し

  • 正規表現:ba?
  • 対象文字列:bxyzbaxyzbaaxyz
  • bregonig.dll Ver.4.20 with Onigmo 6.2.0でのマッチ結果〔全体検索時〕:bbaba 👉aが1回あればbaに、aがなければbだけにマッチする〔aが0回の場合〕。baaの部分では、baまでがマッチし、残りのaにはマッチしない。
  • (b)xyzbaが0回〕〔半角丸括弧内文字列にマッチ〕
  • (ba)xyzbaaが1回〕〔半角丸括弧内文字列にマッチ〕
  • (ba)axyzba〔最初のaのみマッチ〕〔半角丸括弧内文字列にマッチ〕

【4】{n}:ちょうどn回の繰り返し

  • 正規表現:a{3}
  • 対象文字列:aaabaaa
  • bregonig.dll Ver.4.20 with Onigmo 6.2.0でのマッチ結果〔半角丸括弧内文字列にマッチ〕:(aaa)baaaaaab(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\naa(a)\r\naaa(\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の検索)での活用例も紹介できます。どの環境で使う予定ですか?