这是dotnet Regex-Parser中的一个错误吗?

时间:2009-07-20 07:24:22

标签: c# .net regex

我刚写了一个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解析器中的错误吗?因为我认为我的第一个正则表达式是正确的。如果没有,为什么我必须两次逃避“*”?

3 个答案:

答案 0 :(得分:6)

我认为你会发现"-"也是正则表达式中的一个特殊字符(至少在"[]"位内)。它指定了一系列字符,如"[0-9]"含义和"0123456789"

你的第二个工作原因但你的第一个工作原因不是因为:

  • +位于*之后(范围错误)。
  • +出现在\之前(范围内没有错误)。

澄清一下,你的第二个正则表达式(@"^[\d\+-\\*\/]+$")实际上意味着:

  • "\d";或
  • "\+" thru "\\"(范围很广,包括数字和大写字母);或
  • "*";或
  • "\/"

虽然它编译,但它不是你想要的(因为第二个要点)。我试试这个:

@"^[\d\+\-\*\/]+$"

答案 1 :(得分:4)

使用@“”字符串,您不必双重转义。在你的样本中,你也忘了逃避“ - ”。所以正确的是:

@"^[\d\+\-\*\/]+$"

另一方面,当在[]内时,你不需要逃避那些(只有“ - ”):

@"^[\d+\-*/]+$"

答案 2 :(得分:2)

在表达式中包含 - 作为第一个字符。否则解析器正在寻找范围。