在C#中使用正则表达式排序列表元素

时间:2011-09-15 17:29:24

标签: c# regex

我有一个字符串:

BLOCK
    LIST1 Lorem ipsum dolor sit amet.
    LIST1 Lorem ipsum dolor sit amet.
    LIST1 Lorem ipsum dolor sit amet.
        LIST2 Lorem ipsum dolor sit amet.
        LIST2 Lorem ipsum dolor sit amet.
    LIST1 Lorem ipsum dolor sit amet.
BLOCK
    LIST1 Lorem ipsum dolor sit amet.
        LIST2 Lorem ipsum dolor sit amet.
            LIST3 Lorem ipsum dolor sit amet.
        LIST2 Lorem ipsum dolor sit amet.
    LIST1 Lorem ipsum dolor sit amet.
    LIST1 Lorem ipsum dolor sit amet.
    LIST1 Lorem ipsum dolor sit amet.

并希望将其转换为

1. Lorem ipsum dolor sit amet.
    1. Lorem ipsum dolor sit amet.
    2. Lorem ipsum dolor sit amet.
    3. Lorem ipsum dolor sit amet.
        A. Lorem ipsum dolor sit amet.
        B. Lorem ipsum dolor sit amet.
    4. Lorem ipsum dolor sit amet.
2. Lorem ipsum dolor sit amet.
    1. Lorem ipsum dolor sit amet.
        A. Lorem ipsum dolor sit amet.
            a. Lorem ipsum dolor sit amet.
        B. Lorem ipsum dolor sit amet.
    2. Lorem ipsum dolor sit amet.
    3. Lorem ipsum dolor sit amet.
    4. Lorem ipsum dolor sit amet.

在另一个问题Numbering list elements with Regex in C#中,dtb为每个级别使用了单个计数器,但是我有一个包含字母(A,B,C,D ..)的char数组,并希望将它用于不同的级别。 / p>

2 个答案:

答案 0 :(得分:3)

Numbering list elements with Regex in C#类似

var input = "BLOCK\r\n    LIST1 Lorem ipsum dolor sit amet ...";

var levels = new List<string> { "BLOCK", "LIST1", "LIST2", "LIST3" };
var counter = levels.ToDictionary(level => level, level => 0);

// Replace each key word with incremented counter,
// while resetting deeper levels to 0.
var result = Regex.Replace(input, string.Join("|", levels), m =>
{
    for (int i = levels.IndexOf(m.Value) + 1; i < levels.Count; i++)
    {
        counter[levels[i]] = 0;
    }
    return GetLevelToken(m.Value, ++counter[m.Value]);
});

private static string GetLevelToken(string token, int index)
{
    switch (token)
    {
        case "BLOCK":
            return index.ToString() + ".";
        case "LIST1":
            return index.ToString() + ".";
        case "LIST2":
            return ((char)('A' + index - 1)).ToString();
    }
    return "";
}

答案 1 :(得分:1)

以旧时尚的方式做这件事可能更容易:

  1. 将字符串放入数组
  2. 使用适当的行替换“BLOCK”,使用适当的行号替换“LIST1”,使用适当的行号替换每个“LIST2”,同时将结果插入新的字符串或字符串数​​组中。
  3. 这样可以直接使用并使用单个循环。