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

基本的に1桁の場合は先頭に0を足す必要があります。N1 のようにそれを行うには N01 にする必要がありますが、そのための正規表現パターンは何ですか?

どうもありがとう。

4

3 に答える 3

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)
于 2012-04-15T16:22:22.500 に答える
1

この例では、郵便番号のどの番号を注文する必要があるかわかりません。有効な英国の郵便番号http://blogs.creative-jar.com/post/Valid-UK-Postcdoe-formats.aspxの正規表現の例を次に示します。上記の方法を使用してこれを組み込むと、それができるはずです。

于 2012-04-15T16:42:54.627 に答える
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);
}
于 2012-04-15T17:04:55.607 に答える