Java 正则表达式任何形式的数字都包括括号
我必须验证并匹配Java 正则表达式任何形式的数字都包括括号,java,regex,Java,Regex,我必须验证并匹配字符串中的数字。可接受的格式: 11, -11, +11, (11), (+11), (-11). 不接受半圆括号 我已经创建了一个匹配的regex 11, -11, +11: [\-\+]?\d++ 这很有效。我已经创建了一个模式来应用于括号版本。此字符串是字符串格式方法的基本输入:^(\(%1$s\)|(%1$s)$,其中简单括号用于组捕获,转义括号用于匹配。 结果是: ^(\([\-\+]?\d++\))|([\-\+]?\d++)$ 上述字符
字符串中的数字。可接受的格式:
11,
-11,
+11,
(11),
(+11),
(-11).
不接受半圆括号
我已经创建了一个匹配的regex
11,
-11,
+11:
[\-\+]?\d++
这很有效。我已经创建了一个模式来应用于括号版本。此字符串是字符串格式方法的基本输入:^(\(%1$s\)|(%1$s)$
,其中简单括号用于组捕获,转义括号用于匹配。
结果是:
^(\([\-\+]?\d++\))|([\-\+]?\d++)$
上述字符串的匹配也与(+11
)匹配,这是不可接受的。如果带括号的筛选器是第二个条件,则它与+11)
匹配
你知道如何改进吗
更新:
我不能删除这篇文章,但它是错的。我犯了那个错误,使用了find
方法而不是match
。我的正则表达式很好,可以正常工作。不确定我是否理解您的问题,但这里有一个工作的模式
与您的输入-假设所有令牌都在相同的字符串中
:
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
我真的不明白为什么您尝试使用两种模式:带括号和不带括号。我建议你做以下几点:\(?([+-]?\\d+)?
。此模式捕获任意数字序列,可选择以+或-开头,无论是否用括号括起来。这可能不是最有效的方法,但您可以匹配任何在前后有偏执或前后没有偏执的数字:
(?
(?(!\)
反向前瞻,仅当两者都为false时匹配
但是,匹配不包括偏执,只包括带符号的数字,如果您也想匹配偏执,只需删除正面的“向前看\向后看”
\([\+\-]?\d++\)\(?--编辑--
在使用之前自己测试一下,我不能保证我在这里是正确的,我不是最有经验的人
另外,有关regexp的更多信息,您可以查看它是一个很棒的资源
编辑:认为它也会匹配这样的东西“(-535)”,因为535没有(在它之前和之前),将只匹配数字而不匹配符号,因此必须在负查找后面添加数字和符号,仍然可能有更多的错误在那里这也匹配“(+11”),它不应该匹配。