我必须验证并匹配string
中的数字。可接受的格式:
11,
-11,
+11,
(11),
(+11),
(-11).
半括号是不可接受的。
我创建了一个匹配
的regex
11,
-11,
+11:
[\-\+]?\d++
这很有效。我也创建了一个模式来应用于括号版本。此String是字符串格式方法的基本输入:^(\(%1$s\))|(%1$s)$
其中简单括号用于组捕获,而转义用于匹配。
结果是:
^(\([\-\+]?\d++\))|([\-\+]?\d++)$
上述字符串的匹配项也与(+11
匹配。这是不可接受的。此外,如果带括号的过滤器是第二个条件,而不是+11)
。
知道如何改善这个吗?
更新:
我无法删除此帖,但这是错误的。我犯了错误,使用find
方法代替match
。我的正则表达式很好并且有效。
答案 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+)\)?
。此模式捕获任意前缀为+或 - 的任何数字序列,无论是否用括号括起来。