我刚写了一个regexp来做一个基本的语法检查,如果一个字符串是一个有效的数学公式。 我只是定义了一组有效的字符,并检查一个字符串是否匹配(我稍微修改了正则表达式:
private static readonly String validFormuar = @"^[\d\+-\*\/]+$";
private static bool IsValidFormular(String value)
{
return Regex.IsMatch(value, validFormuar);
}
在这个例子中,我只允许使用数字+, - ,*和/ 因为+,*和/是正则表达式中的特殊字符,所以我将它们转义了 但是,此代码抛出ArgumentException(从德语翻译)
"^[\d\+-\*\/]+$" is beeing analyzed - [x-y]-area in reversed Order.
如果我双重逃避*
private static readonly String validFormuar = @"^[\d\+-\\*\/]+$";
结果与预期一致。
这是System.Text.RegularExpressions解析器中的错误吗?因为我认为我的第一个正则表达式是正确的。如果没有,为什么我必须两次逃避“*”?
答案 0 :(得分:6)
我认为你会发现"-"
也是正则表达式中的一个特殊字符(至少在"[]"
位内)。它指定了一系列字符,如"[0-9]"
含义和"0123456789"
。
你的第二个工作原因但你的第一个工作原因不是因为:
+
位于*
之后(范围错误)。+
出现在\
之前(范围内没有错误)。澄清一下,你的第二个正则表达式(@"^[\d\+-\\*\/]+$")
实际上意味着:
"\d"
;或"\+" thru "\\"
(范围很广,包括数字和大写字母);或"*"
;或"\/"
虽然它编译,但它不是你想要的(因为第二个要点)。我试试这个:
@"^[\d\+\-\*\/]+$"
答案 1 :(得分:4)
使用@“”字符串,您不必双重转义。在你的样本中,你也忘了逃避“ - ”。所以正确的是:
@"^[\d\+\-\*\/]+$"
另一方面,当在[]内时,你不需要逃避那些(只有“ - ”):
@"^[\d+\-*/]+$"
答案 2 :(得分:2)
在表达式中包含 - 作为第一个字符。否则解析器正在寻找范围。