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

Jür*_*ock 1 .net c# regex

我刚写了一个正则表达式来做一个基本的语法检查,如果一个字符串是一个有效的数学公式.我只是定义了一组有效的字符并检查字符串是否匹配(我稍微缩短了正则表达式:

    private static readonly String validFormuar =  @"^[\d\+-\*\/]+$";
    private static bool IsValidFormular(String value)
    {
        return Regex.IsMatch(value, validFormuar);
    }
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我只允许使用数字+, - ,*和/.
因为+,*和/是正则表达式中的特殊字符,所以我将它们转义了.
但是,此代码抛出ArgumentException(从德语翻译)

"^[\d\+-\*\/]+$" is beeing analyzed - [x-y]-area in reversed Order.
Run Code Online (Sandbox Code Playgroud)

如果我双重逃避*

    private static readonly String validFormuar =  @"^[\d\+-\\*\/]+$";
Run Code Online (Sandbox Code Playgroud)

结果如预期.
这是System.Text.RegularExpressions解析器中的错误吗?因为我认为我的第一个正则表达式是正确的.如果没有,为什么我必须两次逃避"*"?

pax*_*blo 6

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

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

  • +之后*(范围误差).
  • +来之前\(范围内没有错误).

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

  • "\d"; 要么
  • "\+" thru "\\"(相当大的范围,包括数字和大写字母); 要么
  • "*"; 要么
  • "\/"

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

@"^[\d\+\-\*\/]+$"
Run Code Online (Sandbox Code Playgroud)