在Java中解析一个字符串

时间:2011-11-05 20:49:51

标签: java parsing

我在Java程序中使用了与下面类似的字符串。我需要把号码拿出来。

Host is up (0.0020s latency).

我需要'('和's'字符之间的数字。例如,在这个例子中我需要 0.0020

6 个答案:

答案 0 :(得分:3)

听起来像正则表达式。

您需要匹配小数,然后解析匹配:

Float matchedValue;
Pattern pattern = Pattern.compile("\\d*\\.\\d+");
Matcher matcher = pattern.matcher(yourString);
boolean isfound = matcher.find();

if (isfound) {
    matchedValue = Float.valueOf(matcher.group(0));
}

答案 1 :(得分:3)

如果您确定它始终是第一个数字,您可以使用常规表达式\d+\.\d+(但请注意,反斜杠需要在Java字符串文字中进行转义)。

试试这段代码:

String input = "Host is up (0.0020s latency).";
Pattern pattern = Pattern.compile("\\d+\\.\\d+");
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
    System.out.println(matcher.group());
}

查看在线工作:ideone

您还可以在正则表达式中包含一些周围的字符,以降低匹配错误数字的风险。要完全按照您在问题中的要求执行操作(即(s之间的匹配),请使用以下正则表达式:

\((\d+\.\d+)s

查看在线工作:ideone

答案 2 :(得分:2)

这取决于你的意思是“相似”。您可以使用正则表达式:

import java.math.BigDecimal;
import java.util.regex.*;

public class Test {
    public static void main(String args[]) throws Exception {
        Pattern pattern = Pattern.compile("[^(]*\\(([0-9]*\\.[0-9]*)s");        
        String text = "Host is up (0.0020s latency).";

        Matcher match = pattern.matcher(text);
        if (match.lookingAt())
        {
            String group = match.group(1);
            System.out.println("Before parsing: " + group);
            BigDecimal value = new BigDecimal(group);
            System.out.println("Parsed: " + value);
        }
        else
        {
            System.out.println("No match");
        }
    }
}

当然,您想要制作模式的具体程度取决于您。这只检查数字,一个点,然后检查一个开括号之后和s之前的数字。您可能需要对其进行优化以使点可选等。

答案 3 :(得分:1)

这是一个很好的网站,用于构建从简单到非常复杂的正则表达式。你选择语言和繁荣。

http://txt2re.com/

答案 4 :(得分:0)

这是一种没有正则表达式的方法

    String str = "Host is up (0.0020s latency).";
    str = str.substring(str.indexOf('(')+1, str.indexOf("s l"));
    System.out.println(str);

答案 5 :(得分:0)

当然,在这种情况下使用正则表达式是最佳解决方案,但在许多简单的情况下,您也可以使用以下内容:

String value = myString.subString(myString.indexOf("("), myString.lastIndexOf("s"))  double numericValue = Double.parseDouble(value);

不建议这样做,因为myString中的文本可能会发生变化。