2017-05-31 55 views
-1

得到的數字我有一個輸入字符串象下面這樣:從字符串C#

"/myWS/api/Application/IsCarAvailable/123456/2017" 

這是我在做一個Web API調用的結束。我需要從URL中輕鬆提取123456。

我希望下面的東西,如將工作

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

然而,當我設置的數字斷點並運行它顯示3個元素的數組的代碼?

Element at [0] is "" 
Element at [1] is 123456 
Element at [2] is 2017 

有誰知道爲什麼它會得到一個空字符串作爲第一個元素?

+0

你只需要字符串'「/ 123456 /」'這部分? – Taysumi

+0

不確定正則表達式,但如果格式保證爲顯示,您可能會考慮'String.Split',並只查看最後兩個元素。 – AlainD

+0

試試這個'\ w +(?= \ d \ /)\ w'。 –

回答

5

我建議匹配,不分裂

string source = @"/myWS/api/Application/IsCarAvailable/123456/2017"; 

    string[] numbers = Regex 
    .Matches(source, "[0-9]+") 
    .OfType<Match>() 
    .Select(match => match.Value) 
    .ToArray(); 

請注意\d+在.net意味着任何 unicode的位數(例如:波斯的:۰۱۲۳۴۵۶۷۸۹):這就是爲什麼我把[0-9]+模式(如果\d+模式是可取的,則爲RegexOptions.ECMAScript)。

+0

你能給出一個快速評論關於匹配和分裂的區別? –

+1

@Ctrl_Alt_Defeat:匹配:正在提取'[0-9] +'(2項);拆分:使用'\ D +'分隔符拆分現有的字符串:'[\ D +] 123456 [\ D +] 2017'並且您有** 3 **項:*空*,'123456','2017' –

+0

感謝您的解釋 –

0

如果字符串總是在相同的格式,這會工作:

string numbers = input.Split('/')[input.Split('/').Length - 2]; 
0

我想這是因爲分裂法「分裂」的匹配表達式的字符串。所以空串是第一場比賽之前的部分。 任何你不會使用Regex.Matches(input,"\\d+")的理由?

 string numtest = "http://www.google.com/test/123456/7890"; 
     var matchResult = Regex.Matches(numtest, "\\d+"); 
     for (int i = 0; i < matchResult.Count; i++) 
      Console.WriteLine($"Element {i} is {matchResult[i].Value}"); 

希望有幫助。問候!