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

本文关键字:排序 列表元素 正则表达式 | 更新日期: 2023-09-27 18:08:56

我有一个字符串:

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.

在另一个问题中,c#中使用Regex对列表元素进行编号,dtb在每个级别使用单个计数器,但我有一个包含字母(a, B, C, D..)的字符数组,并希望将其用于不同的级别。

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

类似于c#中使用Regex对列表元素进行编号

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. 将字符串放入数组
  2. 遍历数组,将"BLOCK"替换为适当的行,将"LIST1"替换为适当的行号,将每个"LIST2"替换为适当的行号,同时将结果插入到一个新的字符串或字符串数组中。

这样就可以直接使用一个循环了