MeWrite Docs

SyntaxError: Invalid regular expression: Invalid quantifier

正規表現の量指定子が不正な場合のエラー

概要

Invalid quantifier エラーは、正規表現の量指定子(*, +, ?, {n,m})の使い方が不正な場合に発生します。

エラーメッセージ

SyntaxError: Invalid regular expression: /+/: Nothing to repeat
SyntaxError: Invalid regular expression: Invalid quantifier
re.error: nothing to repeat at position 0

原因

1. 量指定子の前に対象がない

1
2
3
4
5
// NG: 何もない所に+
const regex = /+abc/;  // SyntaxError

// NG: パターンの先頭に量指定子
const regex = /*abc/;  // SyntaxError

2. 特殊文字のエスケープ忘れ

1
2
3
4
5
// NG: +をリテラルとして使いたい
const regex = /1+1=2/;  // "1111...1=2"にマッチしてしまう

// NG: ?をリテラルとして使いたい
const regex = /what?/;  // "what"または"wha"にマッチ

3. {n,m}の不正な形式

1
2
3
4
5
// NG: 数値でない
const regex = /a{x}/;  // SyntaxError

// NG: 最小値が最大値より大きい
const regex = /a{5,3}/;  // SyntaxError

解決策

1. 特殊文字をエスケープ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// OK: +をリテラルとして
const regex = /1\+1=2/;

// OK: ?をリテラルとして
const regex = /what\?/;

// OK: *をリテラルとして
const regex = /5\*5=25/;

// OK: {}をリテラルとして
const regex = /\{name\}/;

2. 正しい量指定子の使い方

1
2
3
4
5
6
7
// 基本的な量指定子
/a*/     // 0回以上
/a+/     // 1回以上
/a?/     // 0回または1回
/a{3}/   // ちょうど3回
/a{2,4}/ // 2回から4回
/a{2,}/  // 2回以上

3. 文字列から正規表現を作成

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// NG: 特殊文字を含む文字列
const searchTerm = "price: $100+";
const regex = new RegExp(searchTerm);  // SyntaxError

// OK: 特殊文字をエスケープ
function escapeRegex(string) {
    return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}

const searchTerm = "price: $100+";
const regex = new RegExp(escapeRegex(searchTerm));

4. Python での対処

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import re

# NG: エスケープなし
pattern = re.compile("+test")  # re.error

# OK: エスケープ
pattern = re.compile(r"\+test")

# OK: re.escapeを使用
user_input = "1+1=2"
pattern = re.compile(re.escape(user_input))

よくあるパターン

URLパラメータのパース

1
2
3
4
5
// NG: ?をエスケープしていない
const regex = /\?param=([^&]+)/;  // 動作はするが意図と異なる場合も

// OK: より正確なパターン
const regex = /[?&]param=([^&]+)/;

ファイルパスのマッチング

1
2
3
4
5
6
7
8
9
// NG: *がワイルドカードとして動作しない
const regex = /path/*.js/;  // SyntaxError

// OK: 正しい正規表現
const regex = /path\/.*\.js$/;

// または glob パターンとして処理
import { glob } from 'glob';
const files = glob.sync('path/*.js');

数式のパース

1
2
3
4
5
6
// NG: 演算子をそのまま使用
const expr = "1+2*3";
const regex = new RegExp(expr);  // SyntaxError

// OK: 数式パターンを正しく定義
const regex = /\d+([+\-*/]\d+)*/;

電話番号・メールアドレス

1
2
3
4
5
// 電話番号(+を含む)
const phoneRegex = /^\+?[1-9]\d{1,14}$/;

// メールアドレス(+を含む可能性)
const emailRegex = /^[\w.+-]+@[\w.-]+\.[a-zA-Z]{2,}$/;

正規表現の検証

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// 正規表現が有効か確認
function isValidRegex(pattern) {
    try {
        new RegExp(pattern);
        return true;
    } catch (e) {
        return false;
    }
}

console.log(isValidRegex("/abc/"));    // true
console.log(isValidRegex("/+abc/"));   // false

量指定子のまとめ

量指定子意味
*0回以上a* → “”, “a”, “aa”…
+1回以上a+ → “a”, “aa”, “aaa”…
?0回または1回a? → “”, “a”
{n}ちょうどn回a{3} → “aaa”
{n,}n回以上a{2,} → “aa”, “aaa”…
{n,m}n回以上m回以下a{2,4} → “aa”, “aaa”, “aaaa”

エスケープが必要な文字

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
// これらの文字は正規表現で特殊な意味を持つ
// リテラルとして使う場合はエスケープが必要
const specialChars = [
    '.',   // 任意の1文字
    '*',   // 0回以上
    '+',   // 1回以上
    '?',   // 0回または1回
    '^',   // 行頭
    '$',   // 行末
    '{',   // 量指定子開始
    '}',   // 量指定子終了
    '[',   // 文字クラス開始
    ']',   // 文字クラス終了
    '(',   // グループ開始
    ')',   // グループ終了
    '|',   // または
    '\\',  // エスケープ
];

関連エラー

関連エラー

JavaScript の他のエラー

最終更新: 2025-12-23