RegEx将多个字符串与长字符串中的StartWith和EndWith字符串匹配

时间:2019-06-11 09:52:00

标签: c# regex string

问题

我有这个超长字符串(在现实世界中,它的长度超过3000行)

0 PAGE TEST
1 PROPERTY TESTPROP
1 PROPERTY TESTPROP2
1 PROPERTY TESTPROP3

0 PAGE TEST2
1 PROPERTY TESTPROP13
1 PROPERTY TESTPROP223
1 PROPERTY TESTPROP3

0 VIDEO TESTVD
1 PROPERTY TESTPROP1323
1 PROPERTY TESTPROP223
1 PROPERTY TESTPROP3211

所以基本上我想做的是:将所有这些部分合并在一个列表中

EDIT 我想要这样的东西

string str1 = "0 PAGE TEST1... ", 
string str2 = "0 PAGE TEST2..." 
..

并且此字符串应在一个列表中。

我尝试过的内容

这是我的代码

  var start_with_line = $"{level} {value} "; // Is usually "0 PAGE "
  var end_with_line = string.Concat(Enumerable.Repeat(Environment.NewLine, 2)); // Is usually "\r\n\r\n" 

  var expression = $@"\{start_with_line}.+\{end_with_line}"; // Is equivalent to "\0 PAGE.+\\r\n\r\n"
  var matches = content.GetPagesFromContent(expression);

这是我的“ GetPagesFromContent”方法

    private static List<string> GetPagesFromContent(this string content, string expression)
    {
        var list = new List<string>();

        var matches = Regex.Matches(content, expression); // I get 0 matches here
        foreach (Match match in matches)
            list.Add(match.Value);

        return list;
    }

1 个答案:

答案 0 :(得分:1)

您可以使用

private static List<string> GetPagesFromContent(this string content, string level)
{
    return Regex.Split(content, @"(?>\r\n?|\n){2,}")
        .Where(x => x.StartsWith(level))
        .ToList();
}

regex匹配2个或更多出现的CRLF,CR或LF序列(使用原子组禁止回溯到组模式),并使用这些匹配项拆分字符串。

您可以考虑在使用Trim()运行正则表达式之前删掉空格。

相关问题