以下RegEx [0-9]*[ -/]{0,1}[0-9]*
匹配,例如1*2
。
*在我的正则表达式中没有定义,也没有用;以前的空间 - 不需要逃脱(据我所知)
如果我只使用[ -/]
中的两个字符,则1*2
不匹配。
当我更改订单时,例如到[0-9]*[-/ ]{0,1}[0-9]*
,1*2
不匹配(如预期的那样)。
我错过了什么或这是一个错误吗?
我在Java 7和http://www.regexplanet.com/advanced/java/index.html
上有这种行为更新 RegEx用于Bean验证@Pattern(regexp =" [0-9] [ - /] {0,1} [0-9] ")。
答案 0 :(得分:4)
[ -/]
是一个字符类,在字符类中,-
是范围运算符。 “从'空间'到'斜线'的字符范围内的任何字符,包括”。
这意味着它使用ASCII表(基本上)来匹配字符[space]
,!
,"
,#
,$
等...最高为/
。
但是,范围仅在正方向上起作用:从低ASCII码到高ASCII码。当您向高 - >低时,该范围不适用,并且它只搜索3个字符:[space]
,dash
和slash
。
E.g。在一个更容易阅读的例子中:
ascending: [b-g] -> matches 'b', 'c, 'd', 'e', 'f', or 'g'
descending: [g-b] -> matches ONLY 'g', '-', or 'b'
答案 1 :(得分:3)
我认为原因是连字符。
[ -/]
部分实际上是在创建从空格到/
的范围。
答案 2 :(得分:2)
你有[ -/]
表示空格和斜线之间的任何字符。 (ascii 32 - 47)。 *
有ascii 42
,这就是1*2
匹配的原因。
如果您只想匹配- or / or SPACE
,请使用[-/ ]
,将-
放在字符类的开头。