正则表达式任何形式的数字都包括括号

时间:2014-05-13 12:07:48

标签: java regex

我必须验证并匹配string中的数字。可接受的格式:

11, 
-11, 
+11, 
(11), 
(+11), 
(-11).

半括号是不可接受的。

我创建了一个匹配

regex
11, 
-11, 
+11: 

[\-\+]?\d++ 

这很有效。我也创建了一个模式来应用于括号版本。此String是字符串格式方法的基本输入:^(\(%1$s\))|(%1$s)$其中简单括号用于组捕获,而转义用于匹配。 结果是:

^(\([\-\+]?\d++\))|([\-\+]?\d++)$  

上述字符串的匹配项也与(+11匹配。这是不可接受的。此外,如果带括号的过滤器是第二个条件,而不是+11)

知道如何改善这个吗?

更新: 我无法删除此帖,但这是错误的。我犯了错误,使用find方法代替match。我的正则表达式很好并且有效。

3 个答案:

答案 0 :(得分:2)

我不确定我是否理解您的问题,但这里有一个有效的Pattern输入 - 假设所有令牌都在同一个String

String input = "11, -11, +11, (11), (+11), (-11).";
//                           > escaped parenthesis
//                           |  > group 1
//                           |  | > sign
//                           |  | |   > digits
//                           |  | |   |  > EOF group 1
//                           |  | |   |  | > escaped parenthesis
//                           |  | |   |  | |  > alternate
//                           |  | |   |  | |  |> group 2
//                           |  | |   |  | |  || > sign
//                           |  | |   |  | |  || |   > digits
//                           |  | |   |  | |  || |   |  > EOF group 2
//                           |  | |   |  | |  || |   |  |
Pattern p = Pattern.compile("\\(([+-]?\\d+)\\)|([+-]?\\d+)");
Matcher m = p.matcher(input);
while (m.find()) {
    System.out.println(m.group());
    if (m.group(1) != null) {
        System.out.printf("\t%s\n", m.group(1));
    }
    else if (m.group(2) != null) {
        System.out.printf("\t%s\n", m.group(2));
    }
}

<强>输出

11
    11
-11
    -11
+11
    +11
(11)
    11
(+11)
    +11
(-11)
    -11

答案 1 :(得分:0)

它可能不是最有效的方式,但你可以匹配任何在OR之前和之后没有parantheses的数字,但之前和之后没有parantheses:

(?<=\()[\+\-]?\d++(?=\))|(?<![\(\+\-\d])[\+\-]?\d++(?!\))

(?<=\()是一个积极的目光,(?=\))正向前看,只有两者都是真的才会匹配。

(?<![\(\+\-\d])相同的事情 - 编辑 - 负面看后面和(?!\))否定向前看,只有两者都是假的才会匹配。

然而,匹配不包括parantheses,只包含带符号的数字,如果你想匹配parantheses,只需删除正面向前\后面的

\([\+\-]?\d++\)|(?<![\(\+\-\d])[\+\-]?\d++(?!\)) - 编辑 -

在使用前自行测试,我无法保证我在这里是正确的,我不是最有经验的人。

另外,有关regexp的更多信息,您可以查看http://www.regular-expressions.info/这是一个很好的资源。

编辑:认为它也会匹配这样的东西&#34;( - 535&#34;因为535没有(在它之前),只会匹配数字而不是符号,所以不得不添加数字和签名到负面的lookbehind,仍然可能是更多的错误

答案 2 :(得分:-1)

我真的不明白你为什么试图使用2种模式:有和没有括号。我建议您使用以下内容:\(?([+-]?\\d+)\)?。此模式捕获任意前缀为+或 - 的任何数字序列,无论是否用括号括起来。