我可以在不抛出异常的情况下测试正则表达式在C#中是否有效

时间:2008-10-20 14:41:46

标签: c# regex

我允许用户输入正则表达式以匹配IP地址,以便在相关系统中进行IP过滤。我想验证输入的正则表达式是否有效,因为很多用户会弄乱操作,但是有良好的意图。

我当然可以在try / catch中做一个Regex.IsMatch(),看看它是否会爆炸,但有没有更明智的方法呢?速度不是问题,我只是宁愿避免无缘无故地抛出异常。

9 个答案:

答案 0 :(得分:45)

我认为在这种情况下例外情况可以。

这是我放在一起的内容:

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

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

    return true;
}

答案 1 :(得分:37)

只要您捕获非常具体的异常,只需执行try / catch。

如果使用得当,例外并不邪恶。

答案 2 :(得分:4)

不是没有很多工作。正则表达式解析可能非常复杂,并且框架中没有任何公共内容可用于验证表达式。

System.Text.RegularExpressions.RegexNode.ScanRegex()看起来是负责解析表达式的主要函数,但它是内部的(并且无论如何都会抛出任何无效语法的异常)。因此,您需要重新实现解析功能 - 这无疑会在边缘情况或框架更新中失败。

我认为只是捕捉ArgumentException就像你在这种情况下可能有的一样好。

答案 3 :(得分:3)

我曾经在下面的函数中使用过,对此没有任何问题。它同时使用异常和超时,但是可以正常工作。 当然,它适用于.Net Framework> = 4.5。

    public static bool IsValidRegexPattern(string pattern, string testText = "", int maxSecondTimeOut = 20)
    {
        if (string.IsNullOrEmpty(pattern)) return false;
        Regex re = new Regex(pattern, RegexOptions.None, new TimeSpan(0, 0, maxSecondTimeOut));
        try { re.IsMatch(testText); }
        catch{ return false; } //ArgumentException or RegexMatchTimeoutException
        return true;
    }

答案 4 :(得分:1)

格式错误的正则表达式并不是导致异常的最糟糕原因。

除非您辞去非常有限的正则表达式语法子集 - 然后为此编写正则表达式(或解析器) - 我认为您没有其他方法可以测试它是否有效但是尝试从中构建状态机并使其匹配。

答案 5 :(得分:1)

取决于目标对象是谁,我会非常小心。构建可以回溯自身并占用大量CPU和内存的正则表达式并不难 - 它们可以成为有效的拒绝服务向量。

答案 6 :(得分:0)

我有一个方法来测试RegEx是否有效,但它只是将正则表达式包装在Try / Catch中。我不确定是否有更好的方法来做到这一点,但我找不到一个。

答案 7 :(得分:0)

在.NET中,除非你编写自己的正则表达式解析器(我强烈建议反对),否则你几乎肯定需要使用try / catch包装新的Regex对象的创建。

答案 8 :(得分:-1)

通过使用以下方法,您可以检查您的正则表达式是否有效。这里测试模式是你必须检查的模式。

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);
}