2012-04-15 27 views
0

私は英国のポストコードのデータを持っています。アルファベット順にソートしたいのですが、その結果は次のようになります。Regexpが見つかった値で見つけて置き換えます

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

私が欲しいのは次のとおりです。

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

基本的に1桁の場合は、最初に0を追加する必要があります。そのようなことができるには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); 
} 
関連する問題