Вопрос

У меня есть функция, которая запускает созданное пользователем регулярное выражение.Однако, если пользователь вводит регулярное выражение, которое не запускается, оно останавливается и падает.Я пробовал поместить строку в блок Try/Catch, но, увы, ничего не происходит.

Если это поможет, я использую jQuery, но в приведенном ниже коде его нет, поскольку я предполагаю, что он немного более фундаментален.

Редактировать:Да, я знаю, что не избегаю «[», это намеренно и суть вопроса.Я принимаю вводимые пользователем данные и хочу найти способ решить подобные проблемы, чтобы приложение не развалилось.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
    <title>Regex</title>

    <script type="text/javascript" charset="utf-8">
        var grep = new RegExp('gr[');

        try
        {
            var results = grep.exec('bob went to town');
        }
        catch (e)
        {
            //Do nothing?
        }

        alert('If you can see this then the script kept going');
    </script>
</head>
<body>

</body>
</html>
Это было полезно?

Решение

Попробуйте это, новый RegExp выдает исключение

регулярное выражение

    <script type="text/javascript" charset="utf-8">
            var grep;

            try {
                    grep = new RegExp("gr[");
            }
            catch(e) {
                    alert(e);

            }
            try
            {
                    var results = grep.exec('bob went to town');
            }
            catch (e)
            {
                    //Do nothing?
            }

            alert('If you can see this then the script kept going');
    </script>

Другие советы

Проблема в этой строке:

var grep = new RegExp('gr[');

'[' — специальный символ, поэтому его необходимо экранировать.Кроме того, эта строка не заключена в try...catch, поэтому вы все равно получите ошибку.

Редактировать:Вы также можете добавить

alert(e.message);

в предложении catch, чтобы увидеть сообщение об ошибке.Это полезно для всех видов ошибок в JavaScript.

Редактировать 2:Хорошо, мне нужно было более внимательно прочитать вопрос, но ответ все еще там.В примере кода строка, вызывающая нарушение, не заключена в блок try...catch.Я поместил его туда и не получил ошибок в Opera 9.5, FF3 и IE7.

var grep, results;

try {
    grep = new RegExp("gr[");
    results = grep.exec('bob went to town');
}
catch(e) {
    alert(e);
}
alert('If you can see this then the script kept going');

установка инициализации RegExp внутри try/catch будет работать (только что протестировано в FireFox)


var grep, results;

try
{
    grep = new RegExp("gr["); // your user input here
}
catch(e)
{
    alert("The RegExpr is invalid");
}

// do your stuff with grep and results

Побег отсюда — не выход.Поскольку целью этого фрагмента является фактическое тестирование созданного пользователем RegExpr, вам нужно будет перехватить [ как незакрытый контейнер RegExpr.

ваш RegExp не закрывает [

В моем FireFox он никогда не возвращается из конструктора - выглядит как ошибка в реализации RegExp, но если вы предоставляете допустимое выражение, оно работает.

Одним из вариантов является проверка выражений, созданных пользователем.То есть;escape-символы, которые, как вы знаете, остановят ваш сценарий.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top