.NET正则表达式错误:[x-y]以相反顺序排列

时间:2011-09-19 20:28:28

标签: c# regex

我正在创建一个正则表达式,到目前为止我做了这个并试了一下,

 ^([0][1-9]|1[0-2])[/-.]

我收到以下错误。

      parsing "^([0][1-9]|1[0-2])[/-.]" - [x-y] range in reverse order. 
      Description: An unhandled exception occurred during the execution of the current web request.          
      Please review the stack trace for more information about the error and where it originated in  
      the code. 

      Exception Details: System.ArgumentException: parsing "^([0][1-9]|1[0-2])[/-.]" - [x-y] range 
      in reverse order.

在搞砸了一下并试图在我的正则表达式中找到错误之后我只是改变了我的正则表达式

  ([0][1-9]|1[0-2])[-/.]  so basically only changed this [/-.] to [-/.]

它有效。

然后我尝试了一些有效的其他组合。

   [/-]  [/.]  [/.-]  [/-?]

然后我尝试了其他一些无效的方法。

   [/-\*]  [/-\+]
显然“ - ”在某些地方有问题但在其他地方没有问题。 这是一个错误吗?或者我错过了什么?

更新

感谢大家指出,如果“ - ”在中间或未被“\”转义,则假定为“ - ”。

但是,为什么它适用于[/ - ?]或[/ - \?],它是真正定义范围还是从字面上理解?

4 个答案:

答案 0 :(得分:38)

不是错误。在一个字符类(由[…]表示)中,-字符必须是第一个(某些口味允许第一个或最后一个,我相信)如果要包含在文字中。否则,它应表示范围,例如0-9A-Z或甚至/-.

问题在于,根据ASCII(或Unicode?),.位于/之前,因此范围被解释为向后,相当于指定范围7-4

如果你使用[.-/],我不会指望一个解析异常,但你不会得到你期望的结果。

答案 1 :(得分:20)

问题出在这一部分:

[/-.]

这意味着“从'/'到'。''的字符范围 - 但是'/'在'后出现。”在Unicode中,所以范围没有意义。

如果你想要它意味着“斜线,破折号或句号”,那么你想要:

[/\-.]

...换句话说,你需要逃脱破折号。请注意,如果这是在常规C#字符串文字中,您还需要执行另一级别的转义:

string pattern = "[/\\-.]";

使用逐字字符串文字意味着您不需要转义反斜杠:

string pattern = @"[/\-.]";

或者,正如杰伊建议的那样,你可以把破折号放在开头:

[-/.]

或结束:

[/.-]

(我刚刚测试过,所有这三个选项都有效。)

答案 2 :(得分:5)

在字符类[]内,-表示范围,即a和z之间的所有小写字母都可以表示为[a-z]

[/-.]的范围是什么?

答案 3 :(得分:0)

我也有此错误消息,但有一些不同的参数。幸运的是,这只是错误的争论。