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

我允许用户输入正则表达式来匹配IP地址,以便在相关系统中进行IP过滤。 我想验证输入的正则表达式是否有效,因为很多用户出于良心会搞砸操作。

我当然可以在try / catch中执行Regex.IsMatch()并查看它是否以这种方式炸毁,但是有没有更聪明的方法呢? 速度并不是问题,我只是更喜欢避免无缘无故地抛出异常。

Mark S. Rasmussen asked 2020-06-30T04:03:02Z
8个解决方案
46 votes

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

这是我汇总的内容:

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

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

    return true;
}
Jeff Atwood answered 2020-06-30T04:03:45Z
39 votes

只要您捕获非常具体的异常,就可以尝试/捕获。

如果使用得当,异常不是邪恶的。

Robert answered 2020-06-30T04:03:21Z
4 votes

并非没有很多工作。 正则表达式的解析可能会涉及很多,并且框架中没有公开验证表达式的内容。

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

我认为仅捕获ArgumentException是一个好主意,就像您在这种情况下可能会遇到的那样。

Mark Brackett answered 2020-06-30T04:04:14Z
1 votes

格式不正确的正则表达式并不是例外的最坏原因。

除非您辞职到非常有限的regex语法子集-然后为它编写一个regex(或解析器),否则我认为您没有其他方法可以测试它是否有效,而是尝试从中构建状态机并 它匹配的东西。

Tomalak answered 2020-06-30T04:04:39Z
1 votes

根据目标是谁,我会非常小心。 构建可以自我回溯并占用大量CPU和内存的正则表达式并不难-它们可以是有效的拒绝服务媒介。

Clinton Pierce answered 2020-06-30T04:04:59Z
0 votes

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

Jon Tackabury answered 2020-06-30T04:05:19Z
0 votes

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

theraccoonbear answered 2020-06-30T04:05:40Z
-1 votes

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

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);
}
Niharika Singh answered 2020-06-30T04:06:00Z
translate from https://stackoverflow.com:/questions/218680/can-i-test-if-a-regex-is-valid-in-c-sharp-without-throwing-exception