求助:编写可匹配多行换行消息的WhatsApp聊天日志Regex
解决WhatsApp聊天日志多行消息的正则匹配问题
我来帮你搞定这个多行消息匹配的难题!你的原正则无法处理换行消息的核心问题是:.*默认不会匹配换行符,而且没有明确界定消息的结束边界,导致遇到换行就停止匹配了。
原正则的问题点
你的原正则:
(?P<datetime>\d{2}\/\d{2}\/\d{4},\s\d(?:\d)?:\d{2} [pa].m.)\s-\s(?P<name>[^:]*):(?P<message>.*)
其中(?P<message>.*)只能匹配单行内容,因为.不包含换行符,一旦消息里有换行,后面的内容就会被漏掉。
修改后的正则方案
下面这个正则可以完美匹配多行消息,同时准确区分不同的聊天条目:
(?P<datetime>\d{2}\/\d{2}\/\d{4},\s\d{1,2}:\d{2} [ap].m.)\s-\s(?P<name>[^:]*):(?P<message>[\s\S]*?)(?=\s-\s\d{2}\/\d{2}\/\d{4},\s\d{1,2}:\d{2} [ap].m.|$)
关键修改说明
- 把
\d(?:\d)?简化成\d{1,2},写法更简洁,功能完全一致 - 用
[\s\S]*?替代.*:[\s\S]表示匹配任意空白或非空白字符(也就是所有字符,包括换行),*?是非贪婪匹配,避免把下一条聊天的内容也包含进来 - 添加了正向预查
(?=\s-\s\d{2}\/\d{2}\/\d{4},\s\d{1,2}:\d{2} [ap].m.|$):用来精准判断消息的结束位置——要么是下一条聊天的起始标记(日期+-),要么是整个日志的末尾
效果验证
比如对于这样的聊天内容:
05/10/2024, 3:45 p.m. - Dhiraj: Hey, check out this multi-line message!
It spans across
three different lines.
05/10/2024, 3:46 p.m. - Friend: Got it, that works perfectly now!
修改后的正则会正确捕获Dhiraj的完整多行消息,不会把Friend的内容混入其中。
内容的提问来源于stack exchange,提问作者Dhiraj kadam
相关产品推荐
相关产品推荐

