2011-11-05 85 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中的文本可以更改。