我正在创建一个正则表达式,到目前为止我做了这个尝试,
^([0][1-9]|1[0-2])[/-.]
Run Code Online (Sandbox Code Playgroud)
我收到以下错误.
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.
Run Code Online (Sandbox Code Playgroud)
在搞砸了一下并试图在我的正则表达式中找到错误后,我只是改变了我的正则表达式
([0][1-9]|1[0-2])[-/.] so basically only changed this [/-.] to [-/.]
Run Code Online (Sandbox Code Playgroud)
它起作用了.
然后我尝试了一些有效的其他组合.
[/-] [/.] [/.-] [/-?]
Run Code Online (Sandbox Code Playgroud)
然后我尝试了其他一些无效的方法.
[/-\*] [/-\+]
Run Code Online (Sandbox Code Playgroud)
显然" - "在某些地方有问题但在其他地方没有问题.那是一个错误吗?还是我错过了什么?
谢谢大家指出,如果" - "在中间或未被"\"转义,则假定为" - ".
但是,为什么它适用于[/ - ?]或[/ - \?],它真的是在这里定义范围还是从字面上理解它?
Jay*_*Jay 40
不是错误.在字符类(表示为[…])中-,如果要将字符作为文字包含在内,则字符必须是第一个(某些风格允许第一个或最后一个,我相信).否则预期表示的范围内,如0-9或A-Z甚至/-..
问题是,根据ASCII(或Unicode?),它.来自之前/,因此范围被解释为向后,相当于指定范围7-4.
如果你使用过[.-/],我不会指望一个解析异常,但你不会得到你期望的结果.
Jon*_*eet 21
问题在于这部分:
[/-.]
Run Code Online (Sandbox Code Playgroud)
这意味着"从'/'到''''的字符范围 - 但是'/' 在 '' 之后.在Unicode中,所以范围没有意义.
如果你想要它意味着"斜线,破折号或句号",那么你想要:
[/\-.]
Run Code Online (Sandbox Code Playgroud)
......换句话说,你需要逃脱破折号.请注意,如果这是在常规C#字符串文字中,您还需要执行另一级别的转义:
string pattern = "[/\\-.]";
Run Code Online (Sandbox Code Playgroud)
使用逐字字符串文字意味着您不需要转义反斜杠:
string pattern = @"[/\-.]";
Run Code Online (Sandbox Code Playgroud)
另外,正如杰伊建议的那样,你可以把破折号放在开头:
[-/.]
Run Code Online (Sandbox Code Playgroud)
或结束:
[/.-]
Run Code Online (Sandbox Code Playgroud)
(我刚刚测试过,所有这三个选项都有效.)