正则表达式如何捕获至下一个命名捕获组前的全部内容
聊天记录字段提取正则写法
可用正则表达式
直接使用以下正则,开启全局匹配(g修饰符)即可一次性提取所有消息的三个目标字段:
(?<by>\S+)\s*\((?<time>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})\)\s*:?\s*(?<text>[\s\S]*?)(?=\S+\s*\(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\)|$)
规则说明
- 兼容样例里的格式差异:时间右括号后允许出现0或多个空白字符、0或1个冒号,覆盖第一条消息无冒号、第二条消息有冒号的情况
- 正文截断逻辑:
- 正文部分用
[\s\S]*?惰性匹配所有字符(包含换行、空段落),不会默认贪婪吞掉后续全部内容 - 末尾的正向预查规则会在两种场景下停止正文匹配:一是匹配到下一条消息的「用户名+时间戳」头部标识,二是匹配到整个聊天文本的末尾,完全避免跨消息抓取的问题
- 正文部分用
使用提示
提取完成后如果需要干净的正文内容,可以对
text捕获组的结果做首尾空白字符裁剪,去掉多余的换行、空格即可。
内容的提问来源于stack exchange,提问作者crazyguy123
相关产品推荐
相关产品推荐

