这个正则表达式:
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());
}
答案 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。