如何使用正则表达式选取并标记两个表达式之间的字符串
三类变更日志文本的正则匹配实现方案
匹配思路
直接用三个固定的变更短语作为定位锚点,锁定每一段需要标记的文本块,从根源上避免误匹配文本里零散出现的相同短语内容。
可直接落地使用的正则
开启全局、多行匹配修饰符后,套用以下正则即可覆盖全部三类目标文本:^(Solution changed from|Resolved Time changed from|Updated By changed from)[\s\S]*?(?=^(?:Solution changed from|Resolved Time changed from|Updated By changed from)|\Z)
代码段拆解说明
- 表达式开头的
^配合多行匹配修饰符,锁定每一行的起始位置:只有出现在行首的目标短语,才会被判定为日志条目的开头,彻底杜绝零散文本片段的误匹配 - 第一组括号内通过逻辑或枚举全部三类需要匹配的起始关键词,无遗漏覆盖目标范围
[\s\S]*?采用非贪婪匹配规则,吃掉起始关键词后面跟着的所有文本内容,包括空格、换行、特殊符号- 结尾的正向先行断言负责划定匹配的截止边界:要么遇到下一个同类型日志条目的开头,要么匹配到整个文本的最后位置,绝不会跨条目标错后续其他日志内容
调试踩坑提醒
- 必须开启
g(全局匹配)和m(多行匹配)两个修饰符,否则只能匹配到文本中第一个出现的目标条目,没法完成全量标记 - 如果后续需要对匹配到的内容做高亮标记,直接把完整匹配到的文本块替换为对应标记语法就行,不需要额外拆分捕获组
- 遇到匹配范围过大的问题时,先检查是不是误删了非贪婪匹配的
?标识:贪婪模式下会从第一个目标短语一直匹配到文本末尾,出现严重过匹配
内容的提问来源于stack exchange,提问作者user3303981
相关产品推荐
相关产品推荐

