2012-01-03 70 views
3

我有問題想辦法分割字符串的數字。我已經完成的是將字符串拆分爲多個字符。如何從Java中的字符串中拆分數字?

所以如果表達gi356f 它會給:

g 
i 
3 
5 
6 
f 

但我想356被視爲在它自己的尊重一些。和我正在處理的問題包括字符串看起來像(345+3)*/3

我試着看字符串中的當前字符和下一個,並試圖檢查它是否是一個數字,很多錯誤。例如它只能處理兩位數的長數字,如果字符串是43,那麼它也會不太好,它會使用3次兩次。 (例如43次,再次3次)。另外,如果表達式結尾處有多個給定的字符串,那麼也會處理兩次。

我不知道如何解決這個問題。我想也許使用正則表達式或掃描器,但不知道如何去做,即使在線查看一些小代碼的例子。

+1

如果你顯示你已經嘗試過某人可能會幫助你。 – rene 2012-01-03 12:31:06

+0

你只是想提取數字,還是你想分析字符串? – Arne 2012-01-03 12:37:11

+0

我想提取數字,我只是考慮另一件事,我需要處理負數和小數。 所以如果表達式是(-1.53​​ +3),我希望能夠提取 -1.53​​ 不完全確定如何檢查我的字符分析器中的數字是否已完成。 – 2012-01-03 12:38:58

回答

1

堆棧數據結構可能對此有所幫助。因此,您可以執行以下操作:

  1. 掃描每個字符。
  2. 檢查char是否是數字。如果是的話,放入堆棧。
  3. 繼續添加char到堆棧,直到獲得任何非數字字符。
  4. 一旦您獲得了非數字字符,從堆棧中取出所有數字字符並轉換爲數字。
  5. 繼續直到字符未完成。
+0

我正在試圖像你所描述的那樣實施,我正努力考慮測試條件,以檢查我的意思是負數還是負數。 因爲,即時嘗試將運營商存儲在另一個堆棧和數字在另一個。但我想把-1.54當成一個數字並將其存儲在一個堆棧中 – 2012-01-03 13:11:20

+0

@hello world:你能否在精確問題域上投射更多光線。傳入的字符串必須有一些限制。這是一個數學表達式還是一個字符流? – Gaurav 2012-01-03 16:50:26

+0

這是一個數學表達式計算器,例如它可以是(-1.54 + 3 * 4/2) – 2012-01-03 18:37:36

0

如果您不需要非數字字符,請執行以下操作:

解析字符串一次,用一個空格替換所有非數字字符。解析生成的字符串,在你走的時候刪除雙空格。輸入字符串gi356f將首先變爲_ ,_爲空格。如果你然後刪除雙空格,你會有你在找什麼。

另一個例子d45 * 9j變成_45_9_,然後,當你將它分成子串時,你將有45和9以及單獨的數字。

有很多方法可以做到這一點,最好的方法是嘗試不同的方法,直到你找到適合你的東西。

3

您可以對此使用正則表達式。這是簡單情況下的解決方案(只是整數)。 \\d是小數,加+表示一次或多次。欲瞭解更多信息,請看http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

import java.util.regex.*; 

public class Main { 
    public static void main(String[] args) { 
    Pattern p = Pattern.compile("\\d+"); 
    Matcher m = p.matcher("(345+3)*/3"); 
    while(m.find()) 
     System.out.println(m.group()); 
    } 
} 
+0

我明白這一點,但有了這個,不知道處理的數字有 - 和小數的組合。例如處理諸如-3.45的數字。我錯過了什麼嗎? – 2012-01-03 13:28:12

+1

你唯一需要做的就是擴展正則表達式。應該很簡單。沒有測試像[+ - ]?\\ d +(\\。\\ d +)?之類的東西。請閱讀有關正則表達式的文檔。它們正是爲這種類型的問題而設計的。 – Arne 2012-01-03 14:10:26

1

您可以使用正則表達式。這裏是一個(非常粗糙)素描:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

String findIntegerOccurrence(String inputString) 
{ 
    // Define pattern to match your numbers here. 
    Pattern pattern = Pattern.compile("... reg expr here..."); 
    Matcher matcher = pattern.matcher(inputString); 

    if (matcher.find()) // Checks if the regular expression matches. 
    { 
     // Extract the substring of inputString that has matched 
     return matcher.group(); 
    } 
    else 
    { 
     return null; 
    } 
} 

你基本上需要定義一個適當的正則表達式爲你的號碼,然後用它來尋找輸入字符串中的所有事件。上面的例子只是一個草圖,看看你如何定義一個正則表達式並與之匹配。既然你想匹配所有出現的數字並將它們與其餘的輸入分開,你需要一個更詳細的解決方案(上面的例子只顯示你需要哪些類和一些有用的方法)。

你可以找到正則表達式的所有細節在Java中的Java documentation

編輯

刪除編輯:我已經添加了所需的正則表達式的說明,但同樣的正則表達式已添加作爲在我可以完成我的更改之前幾分鐘的另一個答案的評論。請參閱其他答案。

-1
Pattern pp = Pattern.compile("\\d+"); 
Matcher m = pp.matcher("sdfsdf123sdfs3464ew111"); 
While(m.find()) 
{ 
    System.out.println(m.group()); 
} 

輸出將是:

123 
3464 
111 

退房!

0

我也創建了一個計算器,我使用Stacks將公式分解爲Numbers和Operators,就像@Gaurav所說的那樣。這裏是我正在使用的代碼:

for (int i=0; i<equation.length(); i++) { 

      equationChar = String.valueOf(equation.charAt(i)); 

      if (numbers.contains(equationChar)) { 

       equationHold += equationChar; 

       if (i==(equation.length()-1)) { 

        stackNumbers.push(equationHold);  
       } 

      } else { 

       stackNumbers.push(equationHold); 
       stackOperators.push(equationChar); 
       equationHold = ""; 

      } 

     } 

我發現它比處理字符串拆分表達式要容易得多。 我不處理括號和東西,所以代碼可能會改變..