如何编写正则匹配单行中多格式包裹的时间戳及对应后续文本
正则匹配时间戳及对应文本问题解决方案
问题背景
我有一个逐行存储的文本文件,每行开头位置必有一个时间戳,行内中间位置也可能包含其他时间戳。其中开头的时间戳固定使用[]包裹,行中间的时间戳固定使用<>包裹。我需要编写正则表达式,将每个时间戳和其后续的对应文本分别捕获为分组,目前尝试多个写法都没有达到预期效果。
文本示例
[00:22.88]Lorem <11:53.82>ipsum dolor sit amet, consectetur <98:23.52>adipiscing elit [00:34.08]eiusmod <00:42.52>tempor incididunt ut <10:67.58>labore et dolore
注:正则每次仅处理单行文本,无需跨行匹配,仅需兼容匹配行尾换行符或文件结束符即可。
期望输出(单行匹配结果示例)
[('00:22.88', 'Lorem '), ('11:53.82', 'ipsum dolor sit amet, consectetur '), ('98:23.52', 'adipiscing elit')]
已尝试的错误写法
- 仅能匹配首个时间戳的写法:
\[(\d{2}:\d{2}.\d{2})\]\s*(.+)
- 尝试用
|匹配两种包裹符号的错误写法:
\[|<(\d{2}:\d{2}.\d{2})\]|>(.+)
- 尝试匹配时间戳之间内容的错误写法:
\[(\d{2}:\d{2}.\d{2})\]\s*<([0-9]+:[0-9.]*)>\s*(.+)\s*
可行解决方案
正确正则表达式
(?:\[|<)(\d{2}:\d{2}\.\d{2})(?:\]|>)([^[<]*)
规则说明
(?:\[|<):非捕获组,匹配时间戳的左边界[或<,不占用捕获分组名额(\d{2}:\d{2}\.\d{2}):捕获分组1,精准匹配时间戳内容,其中.需转义避免匹配任意字符(?:\]|>):非捕获组,匹配时间戳的右边界]或>([^[<]*):捕获分组2,匹配当前时间戳之后、下一个时间戳之前的所有内容,通过排除[和<两个时间戳起始符号自动截断到下一个匹配节点
使用方法
开启正则全局匹配(g标志),对单行文本执行匹配后,依次提取每个匹配结果的第1、2个捕获分组,即可得到预期的时间戳+对应文本的配对结果。
内容的提问来源于stack exchange,提问作者tralph3
相关产品推荐
相关产品推荐

