来自Java bug的正则表达式还是我错过了什么?

时间:2016-02-11 00:15:36

标签: java regex

这个正则表达式:

private static String p = "^\\(([-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?))\\,([-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?))\\)$";//"^(\\-?\d+(\.\d+)?),\s*(\\-?\d+(\\.\d+)?)$";

我无法获得价值,我不明白为什么......

输入如下:

(50,180)    //or even
(-50,-180) 

为什么我的正则表达式不能得到数字180并且可以得到值50? 我的意思是,我的Pattern对象总是可以在括号之后和“,”之前获得第一个值,但是不能在“,”之后得到值。

我的正则表达式有什么问题?

我的代码:

private static String patternGeographicCoordinates = "^\\(([-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?))\\,([-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?))\\)$";
....
Pattern geographicCoordinates = Pattern.compile(patternGeographicCoordinates);
try(BufferedReader br = new BufferedReader(new FileReader(file))) {
        StringBuilder sb = new StringBuilder();
        String line = br.readLine();
....
Matcher m1 = geographicCoordinates.matcher(line); //line is a line from a file (String)
....
if(m1.matches()){
    System.out.println("IT DID WORK, LINE: "+line+", M.GROUP: "+m1.group(3));
    sb.append(line);
    sb.append(System.lineSeparator());
}

3 个答案:

答案 0 :(得分:3)

为什么不删除括号并在逗号周围拆分?

import org.apache.commons.lang3.StringUtils;
...
theString = StringUtils.strip(theString,"()"));
String[] tokens = theString.split(",");
Double number2 = Double.parse(tokens[1]);

答案 1 :(得分:3)

如果你想使用正则表达式,你可以这样做:

Pattern p = Pattern.compile("\\(([-]?\\d+)\\s*\\,\\s*([-]?\\d+)\\)$");
String input = "(-50,-80)";
Matcher m = p.matcher(input);
if(m.find())
{
   System.out.println(m.group(1));
   System.out.println(m.group(2));
}

请参阅演示here

答案 2 :(得分:2)

你正在寻找错误的群体指数。使用此解析器检查您的正则表达式:https://regex101.com/

以下是输入(50,180)的匹配组:

1.  [1-3]   `50`
2.  [1-3]   `50`
5.  [4-7]   `180`
6.  [4-7]   `180`

<强>更新

regexp用于输入比您在示例中提供的更复杂的输入,这就是具有null值的组的原因。附加组用于小数部分和特殊情况(对于坐标解析显然很有意义)。

查看输入(90.00,180.00)。它被解析为以下几组:

1.  [1-6]   `90.00`
2.  [1-6]   `90.00`
4.  [3-6]   `.00`
5.  [7-13]  `180.00`
6.  [7-13]  `180.00`
7.  [10-13] `.00`

现在,组4匹配(\.0+)?,组7匹配(\.\d+)。你看到|90是另一种选择,大概是90.00度的特殊情况。这就是为什么第3组仍然是空的但是4被填满的原因。

使用输入(85.21,150.34),您将获得更多群组:

1.  [1-6]   `85.21`
2.  [1-6]   `85.21`
3.  [3-6]   `.21`
5.  [7-13]  `150.34`
6.  [7-13]  `150.34`
8.  [7-10]  `150`
9.  [7-10]  `150`
11. [10-13] `.34`

现在第3组已填满,但不是第4组,因为它是[1-8]?\d个案例。

此外,由于您有嵌套组,因此将相同的值分配两次:例如1和2。