AutoHotkey 2.0

正規表現のメモ|自分用

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