【问题标题】:Is this a bug in dotnet Regex-Parser?这是 dotnet Regex-Parser 中的错误吗?
【发布时间】:2009-07-20 07:24:21
【问题描述】:

我刚刚写了一个正则表达式来检查一个字符串是否是一个有效的数学公式。 我只是定义了一组有效字符并检查字符串是否匹配(我稍微缩短了正则表达式:

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

【问题讨论】:

  • 如果你看到蹄印,想想马,而不是斑马。操作系统可能没有损坏。数据库可能很好。 ——安迪·亨特和戴夫·托马斯 :)
  • @Firas:这对牛仔来说很好,但如果你住在塞伦盖蒂呢。

标签: c# .net regex


【解决方案1】:

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

第二个有效但第一个无效的原因是:

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

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

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

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

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

【讨论】:

  • 明显错误太明显了。非常感谢。
【解决方案2】:

使用@"" 字符串,您不必双重转义。在您的示例中,您还忘记了转义“-”。所以正确的应该是:

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

另一方面,当在 [] 中时,您不需要转义那些(只有“-”):

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2012-10-11
      • 2013-05-04
      • 2011-09-28
      • 2017-07-23
      • 2012-09-15
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多