2012-11-30 615 views
3

我有這個C#代碼,我發現並改進了我的需求,但現在我想讓它適用於所有數字數據類型。使用正則表達式從字符串中提取數字

public static int[] intRemover (string input) 
    { 
     string[] inputArray = Regex.Split (input, @"\D+"); 
     int n = 0; 
     foreach (string inputN in inputArray) { 
      if (!string.IsNullOrEmpty (inputN)) { 
       n++; 
      } 
     } 
     int[] intarray = new int[n]; 
     n = 0; 
     foreach (string inputN in inputArray) { 
      if (!string.IsNullOrEmpty (inputN)) { 
       intarray [n] = int.Parse (inputN); 
       n++; 
      } 
     } 
     return intarray; 
    } 

這非常適用於試圖提取整數整數出來的字符串,但我有問題,我現在用正則表達式表達不設置考慮是負數或包含一個十進制數指向他們。我最後的目標就像我所說的那樣,是爲了解決所有數字數據類型的問題。任何人都可以幫我嗎?

+1

您一定要轉而使用'int'數據類型。也許使用'decimal'。不幸的是,我的正則表達式沒有達到要求,所以我無法幫你解答。 – musefan

+0

當你說「所有數字數據類型」時,你是否想要處理指數,十六進制等?或者你只需​​要+/-和小數點處理? – BuddhiP

+0

NumberExtracter會是一個更好的名字。你將如何返回這些數字?因爲你不能在中間返回一個帶有double的int列表。這些數字也有多大?也許你需要創建一個可以容納任何數字的自定義類。 – MrFox

回答

6

可以match它,而不是分裂它

public static decimal[] intRemover (string input) 
{ 
    return Regex.Matches(input,@"[+-]?\d+(\.\d+)?")//this returns all the matches in input 
       .Cast<Match>()//this casts from MatchCollection to IEnumerable<Match> 
       .Select(x=>decimal.Parse(x.Value))//this parses each of the matched string to decimal 
       .ToArray();//this converts IEnumerable<decimal> to an Array of decimal 
} 

[+-]?比賽+- 0或1次的

\d+場比賽1對多位數

(\.\d+)?一個(十進制隨後用1到多個數位)匹配0至1時間


上述代碼的簡化形式

public static decimal[] intRemover (string input) 
    { 
     int n=0; 
     MatchCollection matches=Regex.Matches(input,@"[+-]?\d+(\.\d+)?"); 
     decimal[] decimalarray = new decimal[matches.Count]; 

     foreach (Match m in matches) 
     { 
       decimalarray[n] = decimal.Parse (m.Value); 
       n++; 
     } 
     return decimalarray; 
    } 
+0

我對c#和編程一般來說還很新,你能否簡單介紹一下這段代碼是怎麼回事? 也我想我可能會錯過使用此代碼的適當引用,我放棄它,它無法找到「.cast」和其他一些事情的定義。我需要引用什麼來使其工作? –

+0

@AlexZywicki你需要包含'System.Linq' – Anirudha

+0

它引發一個異常,因爲數組索引超出了範圍。在理論上,我可以讓數組變大一點,但是我的工作方式是在數組大小是根據regex.split的結果決定的,這樣可以解決幾乎任何大小的輸入和總是回到陣列的範圍內。 –

1

嘗試修改你這樣的正則表達式:

@"[+-]?\d+(?:\.\d*)?" 
+0

確實。感謝@Rawling,我逃脫了,但Stackoverflow吃了我的反斜槓。我也必須逃避。 – BuddhiP