我在需要解析的文件中有以下内容。
((-2, -1 ), ( 4, 2) ) ((-1.2, 0), (0, 0))
((0, 0), (10, -1))
((5, 3), (5, 4)) ((5, 1) , (5, 5))
((8, 3), (10, 3))
((8, 5), (11.5, 5))
到目前为止,我已经扫描了文件并逐行获取输入,将它们保存为字符串,因此一个字符串将是((-2,-1),(4,2))(( - 1.2, 0),(0,0))。我的问题是从哪里开始。如何从此String中提取双精度数。我试图将括号用作分隔符,并将所有括号更改为逗号,然后使用逗号作为分隔符,但这两种方式都会给我带来错误。有什么想法吗?
Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed group near index 1 at java.util.regex.Pattern.error(Unknown Source) at
java.util.regex.Pattern.accept(Unknown Source) at
java.util.regex.Pattern.group0(Unknown Source) at
java.util.regex.Pattern.sequence(Unknown Source) at
java.util.regex.Pattern.expr(Unknown Source) at
java.util.regex.Pattern.compile(Unknown Source) at
java.util.regex.Pattern.<init>(Unknown Source) at
java.util.regex.Pattern.compile(Unknown Source) at
java.lang.String.replaceAll(Unknown Source)
这样做的目的是从这些双打中创造积分。例如,((0,0),(10,-1))将创建两个点,(0,0)和(10,-1)。我创建了点类,它在构造函数中包含两个双精度数。 这是我试过的:
String toParse = "((0, 0), (10, -1))";
toParse.replaceAll("(", ",");
toParse.replaceAll(")", ",");
Scanner stringScanner = new Scanner(toParse);
stringScanner.useDelimiter(",");
while(stringScanner.hasNextDouble()){
ECT
答案 0 :(得分:4)
您收到的错误消息是因为(
和)
是特殊的正则表达式字符:所以每当您想要替换(或匹配)它们时,您需要使用反斜杠转义它们:
toParse.replaceAll("\\(", ",");
...
那就是说,你可能想在这里使用模式/匹配器方法:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
String source =
"((-2, -1 ), ( 4, 2) ) ((-1.2, 0), (0, 0)) \n" +
"((0, 0), (10, -1)) \n" +
"((5, 3), (5, 4)) ((5, 1) , (5, 5)) \n" +
"((8, 3), (10, 3)) \n" +
"((8, 5), (11.5, 5)) \n";
Matcher m = Pattern.compile("-?\\d+(\\.\\d+)?").matcher(source);
while(m.find()) {
double value = Double.parseDouble(m.group());
System.out.println("value=" + value);
}
}
}
产生:
value=-2.0
value=-1.0
value=4.0
value=2.0
value=-1.2
value=0.0
value=0.0
value=0.0
value=0.0
value=0.0
value=10.0
value=-1.0
value=5.0
value=3.0
value=5.0
value=4.0
value=5.0
value=1.0
value=5.0
value=5.0
value=8.0
value=3.0
value=10.0
value=3.0
value=8.0
value=5.0
value=11.5
value=5.0
代码的作用:它搜索模式-?\d+(\.\d+)?
并将匹配所述模式的每个字符串解析为double
。模式本身意味着:
-? # an optional minus sign
\d+ # followed by one or more digits
(\.\d+)? # followed by an optional decimal DOT with one or more digits
答案 1 :(得分:1)
这是给你的左栏建议。搜索并替换(
和)
到[
和]
的括号,然后使用现成的JSON解析器。
答案 2 :(得分:0)
以下RegEx将捕获这对数字,用逗号分隔并用括号括起来。所以,它给出了:((4,2),
它应该捕获:4,2
并且给定:( -1.0,0)
它将捕获-1.0,0
。从那时起,您可以将字符串分割为,
修剪前导和尾随空格,并将余数解析为Double。
Pattern p = Pattern.compile("\(([^(]+,[^)]+)\)");
Matcher matcher = p.matcher("((-2, -1 ), ( 4, 2) ) ((-1.2, 0), (0, 0))");
while (matcher.find())
{
String str = matcher.group(); // this should in turn take the following values
// -2, -1
// 4, 2
// -1.2, 0
// 0, 0
String[] numbers = str.split(",");
if(numbers.length == 2)
{
// numbers[0] should be the first coordinate
// and numbers[1] should be the second
Double first = new Double(numbers[0].trim());
Double second = new Double(numbers[1].trim());
}
}