2011-11-05 64 views
2

我的字符串格式与Java程序中的字符串类似。我需要拿出号码。解析Java中的字符串

Host is up (0.0020s latency). 

我需要“(”和“S”字符之间的数。例如,我需要的0.0020在这个例子。

回答

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

听起来像对正则表达式的情况。

你想匹配的十进制数字,然后分析那场比赛:

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)); 
} 
+0

我在Perl中做了一个小正则表达式。但是,我不知道如何在Java中使用它。 –

+0

我更新了我的内容,但是请记住float有一些精度问题,所以如果需要精确度,您可能会想用“BigDecimal”来代替,如Jon Skeet的示例所示。此外,我的多重匹配不是防弹的,等等。 – doctorless

+0

如果没有找到数字,你的模式将匹配一个空字符串(或一个单一的'。'),导致Float.valueOf(...)'抛出异常。 –

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

0

这里是一种无正则表达式

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

这是假设“相似”,字符串将以这种格式。 –

1

这是从简单到非常复杂的建设正则表达式一个伟大的网站。你选择语言和繁荣。

http://txt2re.com/

0

使用在这种情况下,正则表达式当然是最好的解决办法,但在许多情况下,简单的你也可以使用类似:

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

这不是推荐的,因为myString中的文本可以更改。