Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式任何形式的数字都包括括号_Java_Regex - Fatal编程技术网

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”),它不应该匹配。