正则表达式找到并替换找到的值

时间:2012-04-15 16:11:32

标签: c# regex

我有英国的邮政编码数据,我想按字母顺序对它们进行排序,当我这样做时,结果如下;

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

我想要的是如下;

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

Basicaly我需要在数字的开头添加0,如果它是1位数。像N1应该是N01才能做到这一点,那是什么样的正则表达式?

非常感谢。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

我不确定在示例中需要订购邮政编码中的哪些数字。以下是有效的英国邮政编码http://blogs.creative-jar.com/post/Valid-UK-Postcdoe-formats.aspx的一些正则表达式示例。如果你使用上面的方法合并它,你应该能够做到。

答案 2 :(得分:0)

这是一个以自然(?)顺序返回原始字符串的sort函数。

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);
}