我可以testing一个正则expression式在C#中是否有效,而不会抛出exception
我允许用户input正则expression式来匹配IP地址,在相关系统中进行IP过滤。 我想validation,如果input的正则expression式是有效的,因为许多用户将乱七八糟,有良好的意图。
我当然可以在try / catch中做一个Regex.IsMatch(),看看它是不是这样,但是有没有更聪明的方法呢? 速度不是这样的问题,我只是为了避免无缘无故抛出exception。
只要你抓住非常特殊的例外,只要做try / catch。
如果使用正确,exception不是邪恶的。
在这种情况下,我认为例外是可以的。
这是我放在一起的:
private static bool IsValidRegex(string pattern) { if (string.IsNullOrEmpty(pattern)) return false; try { Regex.Match("", pattern); } catch (ArgumentException) { return false; } return true; }
不是没有很多的工作。 正则expression式parsing可以相当复杂,框架中没有任何公开内容来validationexpression式。
System.Text.RegularExpressions.RegexNode.ScanRegex()看起来是负责parsingexpression式的主要function,但它是内部的(并且无论如何抛出任何无效语法的exception)。 所以你需要重新实现parsingfunction – 这无疑会在边缘案例或者框架更新上失败。
我认为抓住ArgumentException是一个好主意,你可能在这种情况下。
格式不正确的正则expression式不是exception的最坏原因。
除非你退回到正则expression式语法的一个非常有限的子集 – 然后编写一个正则expression式(或parsing器) – 我认为你没有其他testing方式,如果它是有效的,但试图从它build立一个状态机,并使它匹配的东西。
根据谁的目标是这个,我会非常小心。 构造正则expression式并不难,这些正则expression式可以自行回溯,并消耗大量的CPU和内存 – 它们可以成为有效的拒绝服务向量。
我有一个方法来testing一个正则expression式是否有效,但它只是在一个Try / Catch包装的正则expression式。 我不确定是否有更好的方法来做到这一点,但我找不到。
在.NET中,除非你写自己的正则expression式parsing器(我强烈build议不要),你几乎肯定会需要用try / catch来包装新的正则expression式对象的创build。
通过使用以下方法,您可以检查您的调节器expression式是否有效。 这里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); }