2010-08-26 58 views
5
string sentence = "X10 cats, Y20 dogs, 40 fish and 1 programmer."; 

string[] digits = Regex.Split (sentence, @"\D+"); 

此代碼我得到的數字數組值這樣10,20,40,1怎麼提取字符串的十進制數在C#

string sentence = "X10.4 cats, Y20.5 dogs, 40 fish and 1 programmer."; 

string[] digits = Regex.Split (sentence, @"\D+"); 

這段代碼我在數字數組一樣獲取值這10,4,20,5,40,1

但我喜歡得到這樣的10.4,20.5,40,1十進制數如何做到這一點。

+0

我喜歡他如何使用http://dotnetperls.com/regex-split – Wildhorn 2010-08-26 13:13:54

+5

@Wildhorn的非常精確的例子 - 這有什麼錯呢?他可能在尋找問題的答案時發現它,並注意到它很接近,但還不夠接近。 – 2010-08-26 14:12:44

回答

20

小的改進,以@邁克爾的解決方案:

// NOTES: about the LINQ: 
// .Where() == filters the IEnumerable (which the array is) 
//  (c=>...) is the lambda for dealing with each element of the array 
//  where c is an array element. 
// .Trim() == trims all blank spaces at the start and end of the string 
var doubleArray = Regex.Split(sentence, @"[^0-9\.]+") 
    .Where(c => c != "." && c.Trim() != ""); 

返回:

10.4 
20.5 
40 
1 

原始解決方案返回

[empty line here] 
10.4 
20.5 
40 
1 
. 
+2

。在哪裏(W =>!String.IsNullOrEmpty(W))更優雅。 (> = .net 4) – Alexandre 2013-10-09 19:11:12

+0

這不適用於負值。 – 2017-09-28 23:29:19

+0

@kami:這是因爲正則表達式只查找正數。你必須修改你的情況的正則表達式。但是,我的答案是專門(7年前)旨在解決OP,而不是針對所有情況。 – code4life 2017-09-29 14:57:50

0

如果你有LINQ的:

stringArray.Select(s=>decimal.Parse(s)); 

一個foreach也將工作。您可能需要檢查每個string實際上是一個數字(.Parse不會拋出異常)。

+0

我如何得到s值 – ratty 2010-08-26 13:22:06

+0

s是Linq查詢的範圍內變量。它類似於foreach(stringArray中的字符串s)。 – 2010-08-26 15:05:33

5

嘗試

Regex.Split (sentence, @"[^0-9\.]+") 
+1

這也會讓你對10.1.1.4的值產生誤判。 – 2010-08-26 13:14:57

+1

插入符號(^)是否否定了這一點? – 2010-08-26 13:16:42

+0

@Daren Thomas,\ D等於[^ 0-9] – 2010-08-26 13:34:09

1

檢查語法詞法分析器,用於爲小數正則表達式大多數編程語言。 將該正則表達式匹配到字符串,查找所有匹配項。

0

您需要允許正則表達式中的小數位數。請嘗試以下操作:

\d+(\.\d+)? 

這將匹配的數字,而不是比數字其他的一切,但它應該是簡單的通過比賽來迭代來構建陣列。

東西要記住是你是否也應展望爲負面跡象,逗號等

4

十進制/浮點數提取正則表達式可能會有所不同,具體取決於是否使用了幾千個分隔符,什麼符號表示小數點分隔符,是否還想匹配指數,是否匹配正數或負數符號,無論是否匹配可能導致0省略的數字,無論是否提取以小數點分隔符結尾的數字。

通用的正則表達式匹配Matching Floating Point Numbers with a Regular Expression提供最常見的十進制數種類型:

[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)? 

我只改變了捕獲組到一個非捕獲一個((之後加入?:)。It matchesenter image description here

如果你需要使它更加通用,如果小數點分隔符可以是一個點或一個逗號,與字符類(或括號表達式)替換\.[.,]

[-+]?[0-9]*[.,]?[0-9]+(?:[eE][-+]?[0-9]+)? 
      ^^^^ 

注意上面的表達式匹配整數和浮點數只匹配浮動/十進制數確保小數圖案部分是通過後\.demo)去除第二?強制性:現在

[-+]?[0-9]*\.[0-9]+(?:[eE][-+]?[0-9]+)? 
      ^

34不匹配:enter image description here匹配。

如果你不想沒有前導零匹配浮點數(如.5使第一個數字匹配模式強制(加入+量詞,來匹配1個或多個數字):

[-+]?[0-9]+\.[0-9]+(?:[eE][-+]?[0-9]+)? 
     ^

請參閱this demoenter image description here

現在,如果你不想匹配<digits>.<digits><digits>.<digits>.<digits>.<digits>什麼:現在,它少得多的樣本相匹配?如何與它們匹配作爲整詞?使用lookarounds

[-+]?(?<!\d\.)\b[0-9]+\.[0-9]+(?:[eE][-+]?[0-9]+)?\b(?!\.\d) 

而且一個demo here

enter image description here

現在,對那些有千個分隔符,像12 123 456.2334,345,767.678花車?您可以在第一[0-9]+之後添加(?:[,\s][0-9]+)*匹配逗號或空格,隨後用1個+數字的零個或多個序列:

[-+]?(?<![0-9]\.)\b[0-9]+(?:[,\s][0-9]+)*\.[0-9]+(?:[eE][-+]?[0-9]+)?\b(?!\.[0-9]) 

regex demo

enter image description here

交換與\.逗號如果您需要使用逗號作爲小數點分隔符和句點千位分隔符。

現在,如何在C#中使用這些模式?

var results = Regex.Matches(input, @"<PATTERN_HERE>") 
     .Cast<Match>() 
     .Select(m => m.Value) 
     .ToList(); 
+0

謝謝你的回答。這對於「1,000,000.20」或「1.000.000,20」等字符串不起作用。 – joanfihu 2018-01-29 10:43:15

+0

@joanfihu它[適用於'1,000,000.20',但肯定不適用於'1.000.000,20'](https://regex101.com/r/YFGJAe/1),因爲它們不應該在同一個環境中使用因爲第二個不符合美國數字格式。您需要手動更改表達式以將句點用作數字分組符號和逗號作爲小數點分隔符。 – 2018-01-29 10:48:47

+0

謝謝。第一個例子適用於最後一個正則表達式。我使用了一個用逗號和分數工作的函數。你會用什麼來檢測數字格式?我需要它在美國和英國的格式和世界其他地方工作。 – joanfihu 2018-01-29 11:04:57

相關問題