Подтвердить что ты не робот

Javascript RegEx не работает

У меня есть следующий код javascript:

    function checkLegalYear() {
        var val = "02/2010"; 

        if (val != '') {
           var regEx = new RegExp("^(0[1-9]|1[0-2])/\d{4}$", "g");

            if (regEx.test(val)) {
               //do something
            }
            else {
               //do something
            }
        }
    }

Однако мой тест regEx всегда возвращает false для любого значения, которое я передаю (02/2010). Что-то не так в моем коде? Я пробовал этот код в различных редакторах javascript в Интернете, и он отлично работает.

4b9b3361

Ответ 1

Поскольку вы создаете свое регулярное выражение из строки, вы должны удвоить обратную косую черту:

var regEx = new RegExp("^(0[1-9]|1[0-2])/\\d{4}$", "g");

Когда вы начинаете со строки, вы должны учитывать тот факт, что регулярное выражение сначала будет проанализировано как таковое, то есть как строковая константа JavaScript. Синтаксис для строковых констант ничего не знает о регулярных выражениях, и он имеет свое собственное использование для символов обратной косой черты. Таким образом, к тому времени, когда синтаксический анализатор завершит работу со строками вашего регулярного выражения, он будет выглядеть совсем иначе, чем когда вы смотрите на свой исходный код. Ваша исходная строка выглядит так

"^(0[1-9]|1[0-2])/\d{4}$"

но после разбора строки это

^(0[1-9]|1[0-2])/d{4}$

Обратите внимание, что \d теперь просто d.

Удваивая символы обратной косой черты, вы сообщаете анализатору строк, что вы хотите одиночные реальные обратные косые черты в строковом значении.

Здесь действительно нет причин не использовать синтаксис регулярных выражений:

var regEx = /^(0[1-9]|1[0-2])\/\d{4}$/g;

редактировать - я также заметил, что есть встроенный символ "/", который должен быть заключен в кавычки, если вы используете синтаксис регулярных выражений.