将c#中使用正则表达式的多行文本块拆分为一个matchcollection

本文关键字:拆分 matchcollection 一个 文本 正则表达式 | 更新日期: 2023-09-27 18:12:36

我试图在c#应用程序中使用正则表达式分解包含自由格式文本的数据库字段。添加的注释只是将一个人的注释追加到末尾。下面是示例格式:

Bob Smith [21-Mar-2013 10:46:02 AM]: this that and the other thing
followed by some linefeeds and somesuch
Alexey Jones [08-Jul-2013 1:44:59 PM]: and here is some other comment that I, Alexey deemed worthy to put into the system
I also like using the enter key
Kim Katillicus [09-Jun-2014 2:34:43 PM]: Don't forget about my comments

目的是Alexey希望看到他的注释的输出,而不是其他人的注释的输出(这将输出到一个静态报告)。我正试图使用以下regex模式的变体来恢复匹配集合:

^(.*'['d{2}-'w{3}-'d{4}.*(AM|PM)']:'s['s'S]*)*

我只能得到一个包含所有内容的大blob,或者只与每个人条目的第一行单独匹配。我正在寻找帮助在修复这种模式。我不确定我是否接近了我所拥有的,还是我找错了对象。

注意:我正在用Expresso测试我的表达式。现在我检查了多线路开关

将c#中使用正则表达式的多行文本块拆分为一个matchcollection

问题出在这部分:

['s'S]*

表示"匹配任何大于等于0的空格"。这将绝对包括表达式开头第一次出现之后的所有内容。

在我看来,答案需要比单个正则表达式表达更多的逻辑。例如,正如@evanmcdonnal所指出的,您可以对换行字符进行拆分,然后根据您的序言RegEx匹配每行,将行合并到单个注释中,直到下一次匹配。下面是c#的方法:

public static class CommentsExtractor
{
    private static Regex preambleExpression =
        new Regex(@"^.*'['d{2}-'w{3}-'d{4}.*(AM|PM)']:'s");
    public static List<string> CommentsFromText(string text)
    {
        var comments = new List<string>();
        var lines = text.Split(new char[]{''n', ''r'},
            StringSplitOptions.RemoveEmptyEntries);
        var currentComment = new StringBuilder();
        bool anyMatches = false;
        foreach (var line in lines)
        {
            var match = preambleExpression.Match(line);
            // If we see a new preamble, it's time to push
            //  the current comment into the list.
            // However, the first time through, we don't have
            //  any data, so we'll skip it.
            if(match.Success)
            {
                if (anyMatches)
                {
                    comments.Add(currentComment.ToString());
                    currentComment.Clear();
                }
                anyMatches = true;
            }
            currentComment.AppendLine(line);
        }
        // Now we need to push the last comment
        comments.Add(currentComment.ToString());
        return comments;
    }
}

在Github上有一个工作的WPF应用程序示例。