2012-12-21 54 views
0

我已經看到了一些有趣的方法來處理字符串使用LINQ:用X的替換它們LINQ字符串處理在1個拉姆達2個字符表達

舉例來說,隱藏在一個字符串的數字我可以這樣做:

string strNum = "Hello, my number is ... 3456c456"; 

string strHidden = new String(strNum.ToCharArray() 
    .Select(c => (!char.IsNumber(c)) ? c : 'X').ToArray()); 

Console.WriteLine(strHidden); 

有沒有一種Linq方式來做到這一點,只有當前字符是數字時,數字纔會被替換,而下面兩個字符是數字?

有很多方法可以定製上述方法,但我想知道是否有一種易於使用的linq方式來同時處理多個字符。

編輯:增加了對當前字符的要求,也是一個數字。

+5

這聽起來像是一個正則表達式的工作,而不是LINQ –

+1

只有在下面兩個字符都是數字時才被替換,你會希望在你的例子中替換'34'和'4',而不是'56'兩個時間? – Rawling

+1

您不需要在您的示例中調用'ToCharArray',因爲字符串實現了'IEnumerable '。 – Lee

回答

5

基於對我的評論的解釋,你可以用LINQ做到這一點:

string strHidden = new String(Enumerable.Range(0, strNum.Length) 
    .Select(i => 
     char.IsNumber(strNum[i]) && 
     Enumerable.Range(i+1,2).All(j => j < strNum.Length && char.IsNumber(strNum[j])) 
      ? 'X' 
      : strNum[i]) 
    .ToArray()); 

正則表達式的選擇:

var strHidden = Regex.Replace(strNum, @"\d(?=\d{2})", "X"); 

的效果好很多,不是嗎?

+1

更好的正則表達式;刪除我 –

+0

今天,我瞭解到'regex.Replace' with look_behind_將取代一個匹配,即使更早的替換渲染匹配不再是真實的。 (所以如果你修改這個以替換數字_preceeded_兩位數,它會替換組中的第三和第四,第五......數字。) – Rawling

+0

@Marc不是更好,只是解決了不同的問題:) – Rawling

相關問題