. net正则表达式错误:[x-y]范围颠倒
本文关键字:范围 x-y 正则表达式 错误 net | 更新日期: 2023-09-27 18:09:15
我正在创建一个正则表达式,到目前为止,我这样做了,并尝试了它,
^([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 [-/.]
,它成功了。
然后我尝试了其他一些有效的组合。
[/-] [/.] [/.-] [/-?]
然后我尝试了一些其他的不起作用。
[/-'*] [/-'+]
所以显然"-"在某些地方有问题,但在其他地方没有问题。是一个bug吗?还是我错过了什么?
更新感谢各位指出,如果"-"位于中间或未被"'"转义,则假定"-"为范围。
然而,为什么它对[/-有效?或[/-'?]它是真正定义了范围,还是从字面上理解?
不是bug。在字符类(用[…]
表示)中,如果要作为文字包含,则-
字符必须是第一个(我相信有些风格允许是第一个或最后一个)。否则,它将表示一个范围,如0-9
或A-Z
甚至/-.
。
问题是,根据Unicode, .
出现在/
之前,因此范围被解释为向后,相当于指定范围7-4
。
如果您使用[.-/]
,我不希望出现解析异常,但是您不会得到预期的结果。
问题出在这部分:
[/-.]
表示"从'/'到'的字符范围"。' ' -但是'/'在之后。',所以这个范围没有意义。
如果你想要它表示"斜杠,破折号或句号",那么你需要:
[/'-.]
…换句话说,你需要避开破折号。注意,如果这是在一个普通的c#字符串文字中,你还需要执行另一级转义:
string pattern = "[/''-.]";
使用逐字字符串字面值意味着您不需要转义反斜杠:
string pattern = @"[/'-.]";
或者,就像Jay建议的那样,你可以在开头加上破折号:
[-/.]
或结束:
[/.-]
(我刚刚测试过,这三个选项都可以)
在字符类(即[]
)中,-
表示一个范围,即a和z之间的所有小写字母都可以表示为[a-z]
。
[/-.]
的取值范围是什么?