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(“