Могу ли я проверить, является ли регулярное выражение в C # без исключения - PullRequest
44 голосов
/ 20 октября 2008

Я разрешаю пользователям вводить регулярные выражения для сопоставления IP-адресов для выполнения фильтрации IP в связанной системе. Я хотел бы проверить, правильны ли введенные регулярные выражения, поскольку многие пользователи будут связываться с операциями, хотя и с благими намерениями.

Я, конечно, могу сделать Regex.IsMatch () внутри try / catch и посмотреть, не взорвется ли он таким образом, но есть ли более разумные способы сделать это? Скорость не является проблемой как таковой, я просто предпочитаю избегать исключения без причины.

Ответы [ 8 ]

45 голосов
/ 21 ноября 2009

Я думаю, что в этом случае все в порядке.

Вот что я собрал:

private static bool IsValidRegex(string pattern)
{
    if (string.IsNullOrEmpty(pattern)) return false;

    try
    {
        Regex.Match("", pattern);
    }
    catch (ArgumentException)
    {
        return false;
    }

    return true;
}
37 голосов
/ 20 октября 2008

Пока вы ловите очень специфические исключения, просто делайте попытку / ловите.

Исключения не являются злыми, если используются правильно.

4 голосов
/ 20 октября 2008

Не без большой работы. Разбор регулярных выражений может быть довольно сложным, и в Framework нет ничего общедоступного для проверки выражения.

System.Text.RegularExpressions.RegexNode.ScanRegex () выглядит как основная функция, отвечающая за синтаксический анализ выражения, но она внутренняя (и в любом случае выдает исключения для любого недопустимого синтаксиса). Поэтому вам потребуется переопределить функцию синтаксического анализа, что, несомненно, приведет к сбою в крайних случаях или обновлениях Framework.

Я думаю, что просто поймать ArgumentException - такая же хорошая идея, как и у вас в этой ситуации.

1 голос
/ 21 октября 2008

В зависимости от того, кто является целью для этого, я буду очень осторожен. Нетрудно создать регулярные выражения, которые могут возвращаться назад и потреблять много ресурсов процессора и памяти - они могут быть эффективным вектором отказа в обслуживании.

1 голос
/ 20 октября 2008

Неправильное выражение не является худшей из причин для исключения.

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

0 голосов
/ 22 ноября 2013

Используя следующий метод, вы можете проверить, является ли выражение вашего регулятора действительным или нет. здесь testPattern - шаблон, который вы должны проверить.

public static bool VerifyRegEx(string testPattern)
{
    bool isValid = true;
    if ((testPattern != null) && (testPattern.Trim().Length > 0))
    {
        try
        {
            Regex.Match("", testPattern);
        }
        catch (ArgumentException)
        {
            // BAD PATTERN: Syntax error
            isValid = false;
        }
    }
    else
    {
        //BAD PATTERN: Pattern is null or blank
        isValid = false;
    }
    return (isValid);
}
0 голосов
/ 20 октября 2008

В .NET, если вы не напишите свой собственный синтаксический анализатор регулярных выражений (что я настоятельно рекомендую), вам почти наверняка понадобится обернуть создание нового объекта Regex с помощью try / catch.

0 голосов
/ 20 октября 2008

У меня есть метод для проверки допустимости RegEx, но он просто оборачивает регулярное выражение в Try / Catch. Я не уверен, что есть лучший способ сделать это, но я не смог его найти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...