.NET正则表达式错误:范围的顺序相反

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

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

我收到以下错误。

  parsing "^([0][1-9]|1[0-2])[/-.]" - [xy] 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])[/-.]" - [xy] range in reverse order. 

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

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

它工作。

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

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

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

  [/-\*] [/-\+] 

显然“ – ”在某些地方有问题但在其他地方没有问题。 那是一个错误吗? 还是我错过了什么?

更新

谢谢你们指出,如果“ – ”在中间或没有被“\”转义,则假定为“ – ”。

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

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

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

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

问题在于这部分:

 [/-.] 

这意味着“从’/’到””的字符范围 – 但是’/’ 之后 。 在Unicode中,所以范围没有意义。

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

 [/\-.] 

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

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

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

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

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

 [-/.] 

或结束:

 [/.-] 

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

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

[/-.]的范围是多少?

我也有这个错误消息,但有一些不同的参数。 幸运的是,这只是错误的方式arguments。