英国の郵便番号データがあり、アルファベット順に並べ替えたいと思います。その結果は次のようになります。
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 にする必要がありますが、そのための正規表現パターンは何ですか?
どうもありがとう。
正規表現の使用に熱心な場合は、これでうまくいくはずです
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)
この例では、郵便番号のどの番号を注文する必要があるかわかりません。有効な英国の郵便番号http://blogs.creative-jar.com/post/Valid-UK-Postcdoe-formats.aspxの正規表現の例を次に示します。上記の方法を使用してこれを組み込むと、それができるはずです。
これは、元の文字列を自然な (?) 順序で返すソート関数です。
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);
}