Java 字符串是否包含三个逗号分隔的数字?
如何检查字符串是否符合此格式:Java 字符串是否包含三个逗号分隔的数字?,java,string,parsing,Java,String,Parsing,如何检查字符串是否符合此格式: <number>,<number>,<number> i、 e.三个逗号分隔的值,可解析为双精度值。有时该字符串将包含其他内容(例如文本、更多文本、42或任何内容,实际上是),在这种情况下,我只需要忽略它并继续解析下一个字符串 现在,我只是尝试解析字符串,就好像它符合预期的格式一样,并捕获任何结果异常。什么是更聪明、更便宜的方法?希望没有抛出/捕获异常 String[] parsedLine = line.tr
<number>,<number>,<number>
i、 e.三个逗号分隔的值,可解析为双精度值。有时该字符串将包含其他内容(例如文本、更多文本、42
或任何内容,实际上是
),在这种情况下,我只需要忽略它并继续解析下一个字符串
现在,我只是尝试解析字符串,就好像它符合预期的格式一样,并捕获任何结果异常。什么是更聪明、更便宜的方法?希望没有抛出/捕获异常
String[] parsedLine = line.trim().split(",");
if (parsedLine.length == 3) {
try {
xCoordinate = Double.parseDouble(parsedLine[0]);
yCoordinate = Double.parseDouble(parsedLine[1]);
groundElevation = Double.parseDouble(parsedLine[2]);
} catch (NumberFormatException nfe) {
//This line does not contain numbers exclusively.
//Assume it's a header/comment.
//Do nothing.
}
} else {
//This is not in the expected x,y,z format.
//Assume it's a header/comment.
//Do nothing.
}
你是你的朋友;这里有一个例子,告诉你怎么做。你是你的朋友;下面是一个如何操作的示例。没有更干净的方法。你的代码很好 你会问:“但例外情况”不应该只在例外情况下使用吗?在这里,我当然会使用它们。” Java没有任何
Double.isValid(String)
方法。如果它有,你可以用它,但它没有。即使这样,您也必须解析double两次:一次检查它是否是double,一次获取double值
您所拥有的是一种常见的习惯用法,我怀疑正则表达式是否比您所拥有的更具可读性和速度 没有更干净的方法。你的代码很好 你会问:“但例外情况”不应该只在例外情况下使用吗?在这里,我当然会使用它们。” Java没有任何
Double.isValid(String)
方法。如果它有,你可以用它,但它没有。即使这样,您也必须解析double两次:一次检查它是否是double,一次获取double值
您所拥有的是一种常见的习惯用法,我怀疑正则表达式是否比您所拥有的更具可读性和速度 您可以对数字使用regex\d。像这样的 \d+,\d+,\d+
抱歉,未经测试:)您可以使用regex\d作为数字。像这样的 \d+,\d+,\d+
抱歉,未经测试:)您现在拥有的可能是最防弹的(在我看来也是最容易理解的)实现
我不会改变它,除非我从分析器中得到具体证据,证明它是一个总体瓶颈(无论是CPU使用率还是产生的垃圾量)。您现在拥有的可能是最防弹的(在我看来也是最容易理解的)实现
我不会改变它,除非我从分析器中得到具体证据,证明它是一个总体瓶颈(无论是CPU使用率还是创建的垃圾量)。在整个文本中使用这个正则表达式 这假设数字和逗号之间没有空格,您可以进行相关更改以添加可选的空格字符
[0-9]+(\.[0-9]*)?,[0-9]+(\.[0-9]*)?,[0-9]+(\.[0-9]*)?
我只是做了些改变
[0-9]+(\.[0-9]*)?\s*,\s*[0-9]+(\.[0-9]*)?\s*,\s*[0-9]+(\.[0-9]*)?
这将是空间友好型的
当然,您必须测试它,尽管在整个文本中使用这个正则表达式 这假设数字和逗号之间没有空格,您可以进行相关更改以添加可选的空格字符
[0-9]+(\.[0-9]*)?,[0-9]+(\.[0-9]*)?,[0-9]+(\.[0-9]*)?
我只是做了些改变
[0-9]+(\.[0-9]*)?\s*,\s*[0-9]+(\.[0-9]*)?\s*,\s*[0-9]+(\.[0-9]*)?
这将是空间友好型的
当然,您必须测试它,尽管我认为它没有那么贵
String.split()
如果您担心异常的代价,那么您可以创建一个更复杂的模式来匹配您的字符串,而您可能不会有异常:
final Pattern pattern = Pattern.compile("^(\\d+(\\.\\d+)?),(\\d+(\\.\\d+)?),(\\d+(\\.\\d+)?)$");
final Matcher matcher = pattern.matcher(line);
if (matcher.matches()) {
xCoordinate = Double.parseDouble(matcher.group(1));
// ...
}
我觉得没那么贵String.split()
如果您担心异常的代价,那么您可以创建一个更复杂的模式来匹配您的字符串,而您可能不会有异常:
final Pattern pattern = Pattern.compile("^(\\d+(\\.\\d+)?),(\\d+(\\.\\d+)?),(\\d+(\\.\\d+)?)$");
final Matcher matcher = pattern.matcher(line);
if (matcher.matches()) {
xCoordinate = Double.parseDouble(matcher.group(1));
// ...
}
您可以从以下位置使用正则表达式进行双精度运算:
您可以从以下位置使用正则表达式进行双精度运算:
一个好的开始是使用Pattern类:booleanb=Pattern.matches(“.*,*,*”,str)代码>
但是,为了确保有数字,您必须有一个更复杂的regexp:
String str = "3.0,87546,0.8273456";
boolean b = Pattern.matches("^(\\d+(\\.\\d+)?),(\\d+(\\.\\d+)?),(\\d+(\\.\\d+)?)$", str);
if (b) {
System.out.println("matches");
} else {
System.out.println("does not match");
}
// output: matches
编辑:我看到KARASZI已经在速度上击败了我,但代码仍然在这里…一个好的开始应该是使用模式类:boolean b=Pattern.matches(“.*,.*,*”,str)代码>
但是,为了确保有数字,您必须有一个更复杂的regexp:
String str = "3.0,87546,0.8273456";
boolean b = Pattern.matches("^(\\d+(\\.\\d+)?),(\\d+(\\.\\d+)?),(\\d+(\\.\\d+)?)$", str);
if (b) {
System.out.println("matches");
} else {
System.out.println("does not match");
}
// output: matches
编辑:我看到KARASZI已经在速度上击败了我,但代码仍然在这里…正则表达式将是解决这个问题的自然方法。我和其他许多人会立即使用这种方法。但是,您在问题中提到,您正在寻找一种成本较低的解决方案。就所使用的资源而言,正则表达式可能更昂贵
对于你的评论“例外情况不应该只在例外情况下使用”,我想说这个问题是一个例外情况;以这种方式使用异常可以创建更优雅的解决方案
您当前的解决方案简单、简洁、易于理解(因此易于维护)。如果它能工作,我就不会浪费时间修改它。正则表达式将是解决这个问题的自然方法。我和其他许多人会立即使用这种方法。但是,您在问题中提到,您正在寻找一种成本较低的解决方案。就所使用的资源而言,正则表达式可能更昂贵
对于你的评论“例外情况不应该只在例外情况下使用”,我想说这个问题是一个例外情况;以这种方式使用异常可以创建更优雅的解决方案
您当前的解决方案简单、简洁、易于理解(因此易于维护)。如果它能工作,我就不会浪费时间来更改它。请记住,您需要正确处理以下内容:1,“text,1.5”,2
。我不是java程序员,但是使用试试{int[]parsedLine=line.trim().split(“