如何验证输入是否包含有效的 .Net 正则表达式?

5

我正在构建一个将命名的正则表达式保存到数据库中的应用程序。看起来是这样的:

Regex form

我正在使用Asp.Net表单。如何验证输入的正则表达式?我希望用户知道输入的正则表达式是否是有效的.Net正则表达式。

该字段应拒绝以下值:

^Wrong(R[g[x)]]$
Invalid\Q&\A

有趣的问题。看着这篇文章是不可能的:https://dev59.com/jU3Sa4cB1Zd3GeqPw6e8 - Dan Fox
这很困难,因为基本上任何东西都可以是正则表达式,只是不正确的正则表达式将无法匹配任何内容。您可以提供一个测试框,让用户输入要匹配的内容,然后您可以测试输入的正则表达式与此测试输入进行比较。 - Davio
@DanFox,验证不一定要通过正则表达式完成,特别是如果这是不可能的。 - Kees C. Bakker
2
@Davio:那不是真的。例如(这样的内容不是有效的正则表达式,因为没有匹配的关闭括号。它需要进行转义才能有效。显然,在正则表达式中还有其他“特殊”的结构会导致其无效。 - Chris
在正则表达式验证正则表达式的话题上,这个规则很强大:https://dev59.com/kHVC5IYBdhLWcg3w1Exq - Kees C. Bakker
2个回答

6

将其制作为新的Regex类。如果它抛出异常,则表示无效。

try{
  new Regex(expression)
}
catch(ArgumentException ex)
{
  // invalid regex
}

// valid regex

我知道,使用异常来控制代码逻辑是错误的。但这似乎是唯一的解决方案。

1
不错,对于这种情况使用异常是可以的。你可以将其包装在自定义的TryParse方法中。 - Davio
也许有人应该写一个正则表达式来验证正则表达式...;-) - Chris
@Chris 这在数学上是不可能的。 - Euphoric
这只是一个玩笑。我非常确定正则表达式语法不够规则(虽然我从未见过证据,所以很想看一下)。 - Chris

2
也许是这样的:

类似于这样的东西:

public static class RegexUtils
{

    public static bool TryParse (string possibleRegex, out Regex regex)
    {
        regex = null;
        try
        {
            regex = new Regex(possibleRegex);
            return true;
        }
        catch (ArgumentException ae)
        {
           return false;
        }
    }
}

能否从异常中获取更多的反馈信息? - Kees C. Bakker
当你遇到ArgumentException时,意味着出现了解析错误。你可以捕获ArgumentNullException - 它是从ArgumentException派生而来的 - 特别是为了检查空模式。 - Davio
@KeesC.Bakker 异常中含有消息。 - Euphoric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接