Java Reg接受*不在[0-9] * [ - /] {0,1} [0-9] *中 - 这是一个错误吗?

时间:2015-08-19 14:26:19

标签: java regex

以下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] ")。

3 个答案:

答案 0 :(得分:4)

[ -/]是一个字符类,在字符类中,-是范围运算符。 “从'空间'到'斜线'的字符范围内的任何字符,包括”。

这意味着它使用ASCII表(基本上)来匹配字符[space]!"#$等...最高为/

但是,范围仅在正方向上起作用:从低ASCII码到高ASCII码。当您向高 - >低时,该范围不适用,并且它只搜索3个字符:[space]dashslash

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,请使用[-/ ],将-放在字符类的开头。