2012-04-15 72 views
0

我有英國郵政編碼數據,我想按字母順序排序,當我這樣做時,結果如下;正則表達式找到並用找到的值替換

N10-XX 
N1-XX 
N2-XX 
N3-XX 
N4-XX 
N5-XX 

我想要的是如下;

N1-XX 
N2-XX 
N3-XX 
N4-XX 
N5-XX 
N10-XX 

基礎我需要在數字的開頭加0,如果它是1位數。像N1應該是N01才能做到這一點,這是什麼正則表達式模式?

非常感謝。

回答

2

那麼,如果你正在使用正則表達式的彎曲,那麼這應該這樣做

var text = @"N10-XX 
N1-XX 
N2-XX 
N3-XX 
N4-XX 
N5-XX"; 

text = Regex.Replace(text, @"^N(\d)-", "N0$1-", RegexOptions.Multiline); 

是說,你顯然會改變原來的數據,所以我不知道這是否是即使適用

如果你想通過數字來排序,但保留原來的數據,那麼你可能需要做這樣的事情

text.Split('\n') 
    .Select(o => new { Original = o, Normal = Regex.Replace(o, @"^N(\d)-", "N0$1-", RegexOptions.Compiled)}) 
    .OrderBy(o => o.Normal) 
    .Select(o => o.Original) 
0

這是一個按自然(?)順序返回原始字符串的排序函數。

List<string> list1 = new List<string>{ "N10-XX","N1-XX","N2-XX","N3-XX","N4-XX","N5-XX" }; 
List<string> list2 = new List<string>() { "File (5).txt", "File (1).txt", "File (10).txt", "File (100).txt", "File (2).txt" }; 

var sortedList1 = MySort(list1).ToArray(); 
var sortedList2 = MySort(list2).ToArray(); 


public static IEnumerable<string> MySort(IEnumerable<string> list) 
{ 
    int maxLen = list.Select(s => s.Length).Max(); 
    Func<string, char> PaddingChar = s => char.IsDigit(s[0]) ? ' ' : char.MaxValue; 

    return 
     list.Select(s => 
       new 
       { 
        OrgStr = s, 
        SortStr = Regex.Replace(s, @"(\d+)|(\D+)", m => m.Value.PadLeft(maxLen, PaddingChar(m.Value))) 
       }) 
      .OrderBy(x => x.SortStr) 
      .Select(x => x.OrgStr); 
}