繁体   English   中英

正则表达式在C#中拆分多行文本

[英]Regex to split multiline text in C#

我正在尝试构建正则表达式以拆分通过WhatsApp的电子邮件发送的消息存档。

例:

23.02.16, 11:01 - Herr Paul Muster: han vpn verbindig zu ufgmacht und die kappt ja sinternet
23.02.16, 11:01 - Herr Paul Muster: jetzt channi mi nümme verbinde 🙈
23.02.16, 11:10 - Herr Paul Muster: merci
25.02.16, 09:09 - Herr Peter Nachname: Bin i 15min im office
07.03.16, 09:29 - Herr Peter Nachname: Da ich weiss dases eh nid kommuniziert wird, schribis eu au. Ich wird hüt dihei blibe, han migräneartigi grindschmerze...lg
07.03.16, 09:30 - Markus: Ok, danke für d'info (und dini hellseherische fähigkeite)
Gueti besserig
04.04.16, 09:24 - Herr Peter Nachname: Bi grad im office 😅
13.04.16, 19:00 - Herr Paul Muster: mir sind usem büro usgschlosse 😂
13.04.16, 19:00 - Herr Paul Muster: händ meeting gah 
und all händ dä schlüssel 
im büro 🎉
13.04.16, 19:08 - Herr Peter Nachname: Lol 🙈
13.04.16, 19:12 - Herr Paul Muster: du bisch eh grossi hilf 😂 bisch nid per zuefall ih dä nöchi?

每行的末尾都有一个换行符(\\ n)。 目前,我正在使用以下代码:

new Regex(@"([\d]{2}.[\d]{2}.[\d]{2}, [\d]{2}:[\d]{2})[\s]-[\s](.*):[\s](.*)");

MatchCollection的第一组包含日期,第二部分包含发件人。 第三组仅包含消息文本,直到行尾为止。 但是我想获得整个消息,包括换行符或直到datepart的下一个匹配项为止的所有消息。

我检查了几个论坛和质量检查页面,但找不到解决我问题的方法。 因此,也许有人可以给我提示解决我问题的正确方法。

您可以在第一个Regex.Replace()中使用此替代方法:

string pattern =  @"(.)$\n(\D\D[^.]\D\D[^.]\D\D)";
string input = ""; // Your multiline input
string replacement = "$1$2";
Regex rgx = new Regex(pattern);
string result = rgx.Replace(input, replacement);

这会给你:

23.02.16, 11:01 - Herr Paul Muster: han vpn verbindig zu ufgmacht und die kappt ja sinternet
23.02.16, 11:01 - Herr Paul Muster: jetzt channi mi nümme verbinde 🙈
23.02.16, 11:10 - Herr Paul Muster: merci
25.02.16, 09:09 - Herr Peter Nachname: Bin i 15min im office 07.03.16, 09:29 - Herr Peter Nachname: Da ich weiss dases eh nid kommuniziert wird, schribis eu au. Ich wird hüt dihei blibe, han migräneartigi grindschmerze...lg 07.03.16, 09:30 - Markus: Ok, danke für d'info (und dini hellseherische fähigkeite)Gueti besserig
04.04.16, 09:24 - Herr Peter Nachname: Bi grad im office 😅
13.04.16, 19:00 - Herr Paul Muster: mir sind usem büro usgschlosse 😂 13.04.16, 19:00 - Herr Paul Muster: händ meeting gah und all händ dä schlüssel im büro 🎉
13.04.16, 19:08 - Herr Peter Nachname: Lol 🙈
13.04.16, 19:12 - Herr Paul Muster: du bisch eh grossi hilf 😂 bisch nid per zuefall ih dä nöchi?

然后,您可以应用new Regex(@"([\\d]{2}.[\\d]{2}.[\\d]{2}, [\\d]{2}:[\\d]{2})[\\s]-[\\s](.*):[\\s](.*)");的正则new Regex(@"([\\d]{2}.[\\d]{2}.[\\d]{2}, [\\d]{2}:[\\d]{2})[\\s]-[\\s](.*):[\\s](.*)"); 有你的小组。


限制:

如果您的新行以日期开头,但不是新条目,则它将行不通。

尝试这个

string pattern = @"([\d]{2}.[\d]{2}.[\d]{2}, [\d]{2}:[\d]{2})[\s]-[\s](.*?):[\s](.*?)(?=\r\n\d|\z)";

var regex = new Regex(pattern, RegexOptions.Singleline);

请注意几个懒惰的量词。

最后,我们检查下一个句子开头或文件结尾处是否存在数字。

单行选项需要指向捕获的任何字符,包括换行符。

感谢您的所有投入

使用以下正则表达式模式,我可以使用Sebasian Proske的输入解决我的问题:

new Regex(@"(\\d{2}\\.\\d{2}\\.\\d{2}, \\d{2}:\\d{2})\\s-\\s(.*?):\\s((?:.+|\\n(?!\\d{2}\\.\\d{2}\\.\\d{2}, \\d{2}:\\d{2}))+)");

这是一个仅.NET的解决方案:

new Regex(@"(^\d{2}\.\d{2}\.\d{2}, \d{2}:\d{2})\s-\s([^:]*):\s(.*?)$",
    RegexOptions.Multiline | RegexOptions.Singleline | RegexOptions.RightToLeft);

多行选项允许^$在行边界匹配,单行允许. 匹配换行符,RightToLeft导致匹配从字符串末尾向后进行。

非贪婪(.*?)使其在Date, Time - Name:序列的第一次出现(或下一次出现,向后退)时停止匹配,因此一次仅匹配一行。 比赛将以相反的顺序进行,但分组不会出现。

如果感觉太像黑魔法了,可以改用以下方法:

new Regex(@"(^\d{2}\.\d{2}\.\d{2}, \d{2}:\d{2})\s-\s([^:]*):\s((?:(?!^\d{2}\.\d{2}\.\d{2},).)*)$",
    RegexOptions.Multiline | RegexOptions.Singleline);

(?:(?!^\\d{2}\\.\\d{2}\\.\\d{2},).)*匹配零个或多个字符(由于使用Singleline选项,包括换行符),直到下一个字符是行首的日期的开始(或直到没有更多字符为止)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM