2011-07-18 50 views
9

我有一個字符串,其中包含以下內容: 「它是你的方式,11.95蘇格蘭的歷史,14.50,在一天的時間裏學習微積分,29.95」 有沒有什麼辦法讓雙打從這個字符串?獲得一個字符串的雙倍數

+3

這是功課,不是嗎? –

回答

1

如果你有意與數字,單週期,多位數的任何和所有的數字,要使用正則表達式。如\s\d*.\d\s,表示空格,後跟數字,句號,更多數字,並以空格結束。

+0

你能告訴我一個例子嗎? – Edward

+0

最好在這種情況下使用\ b而不是\ s。 \ B表示「字邊和相匹配的空間,昏迷,圓點等 – AlexR

+0

看到的例子,我張貼。 – AlexR

14

使用正則表達式提取雙打,然後Double.parseDouble()解析:

Pattern p = Pattern.compile("(\\d+(?:\\.\\d+))"); 
Matcher m = p.matcher(str); 
while(m.find()) { 
    double d = Double.parseDouble(m.group(1)); 
    System.out.println(d); 
} 
+0

其實,這個答案並不雙打內*他們的工作,除非他們有一個小數點。*請參閱我的答案,同測試輸出,對於確實 – Bohemian

+0

解決它完美的作品! –

+0

在負數和數字自然數此正則表達式失敗。 – Stepan

-2

使用正則表達式(正則表達式[P])模塊,你最喜歡的語言,構造一個匹配器的模式\d+\.\d+,將匹配器應用於輸入字符串,並將匹配的子字符串作爲捕獲組。

+1

問題被標記爲Java的。 –

0
String text = "Did It Your Way, 11.95 The History of Scotland, 14.50, Learn Calculus in One Day, 29.95"; 

List<Double> foundDoubles = Lists.newLinkedList(); 

String regularExpressionForDouble = "((\\d)+(\\.(\\d)+)?)"; 
Matcher matcher = Pattern.compile(regularExpressionForDouble).matcher(text); 
while (matcher.find()) { 
    String doubleAsString = matcher.group(); 
    Double foundDouble = Double.valueOf(doubleAsString); 
    foundDoubles.add(foundDouble); 
} 

System.out.println(foundDoubles); 
1

此發現雙打,整數(有和沒有小數點),和級分(領先的小數點):

public static void main(String[] args) 
{ 
    String str = "This is whole 5, and that is double 11.95, now a fraction .25 and finally another whole 3. with a trailing dot!"; 
    Matcher m = Pattern.compile("(?!=\\d\\.\\d\\.)([\\d.]+)").matcher(str); 
    while (m.find()) 
    { 
     double d = Double.parseDouble(m.group(1)); 
     System.out.println(d); 
    } 
} 

輸出:

5.0 
11.95 
0.25 
3.0 
+0

不過請注意parseDouble仍然可以拋出應逮住一個例外。伊莫避免所有的東西,只是使用Scanner.nextDouble()更簡單 – Voo

+0

你的前瞻性取消了部分標題(例如'3.2.4')的資格,但你的捕獲組重新允許它們,[使其失敗](http:// www.ideone.com/5nARX)。 –

8

Java提供Scanner它允許您掃描一個String(或任何輸入流)並使用正則表達式分析基元類型和字符串標記。

這很可能是preferrable使用這個,而不是寫自己的正則表達式,純粹是爲了維護原因。

Scanner sc = new Scanner(yourString); 
double price1 = sc.nextDouble(), 
     price2 = sc.nextDouble(), 
     price3 = sc.nextDouble(); 
0

這裏是我做到了,當我從用戶獲取輸入,不知道它會是什麼樣子:

Vector<Double> foundDoubles = new Vector<Double>(); 

    Scanner reader = new Scanner(System.in); 
    System.out.println("Ask for input: "); 

    for(int i = 0; i < accounts.size(); i++){ 
     foundDoubles.add(reader.nextDouble()); 
    } 
1

使用掃描儀(例如,從TutorialPoint)。 以上建議的正則表達式表達式在此示例上失敗:"Hi! -4 + 3.0 = -1.0 true"檢測到{3.0, 1,0}

String s = ""Hello World! -4 + 3.0 = -1.0 true""; 

    // create a new scanner with the specified String Object 
    Scanner scanner = new Scanner(s); 

    // use US locale to be able to identify doubles in the string 
    scanner.useLocale(Locale.US); 

    // find the next double token and print it 
    // loop for the whole scanner 
    while (scanner.hasNext()) { 

    // if the next is a double, print found and the double 
    if (scanner.hasNextDouble()) { 
    System.out.println("Found :" + scanner.nextDouble()); 
    } 

    // if a double is not found, print "Not Found" and the token 
    System.out.println("Not Found :" + scanner.next()); 
    } 

    // close the scanner 
    scanner.close(); 
    }