Markdown活动追踪文件正则匹配问题:生成每日及时间报告
修正正则匹配,精准提取项目标题与活动块
我来帮你搞定这个正则匹配的问题!先梳理下核心需求:你需要从MASTERFILE里精准提取两类内容——项目标题行(格式为## %XXX ProjectName1)和从CHRG=起始到<br>结束的活动内容块,之前匹配出无关内容,大概率是因为贪婪匹配、边界未限定或模式设置不对,下面给出针对性的正则方案:
1. 匹配项目标题行
要确保只匹配整行的项目标题(避免匹配到文本中类似格式的子串),用多行模式的正则:
^## %(\S+) (.+)$
正则解释:
^:匹配行开头(需启用多行模式m,让^/$对应每行首尾)## %:固定前缀,严格匹配项目标题的开头格式(\S+):捕获项目标识(比如XXX,\S+匹配非空白字符,适配字母/数字/符号组合的标识)(.+):捕获项目名称(匹配标题剩余的所有内容,直到行尾)$:匹配行结尾
2. 匹配CHRG=到<br>的活动块
如果活动块可能跨行(比如CHRG=在一行,<br>在后续行),需要启用**单行模式s**让.匹配换行符,同时用非贪婪匹配避免过度抓取:
(?s)CHRG=.+?<br>
正则解释:
(?s):开启单行模式,使.能匹配换行符(处理跨行的活动块)CHRG=:固定起始标识,精准定位活动块开头.+?:非贪婪匹配任意字符(直到遇到第一个<br>就停止,避免抓取多个活动块的内容)<br>:固定结束标识,匹配活动块的结尾
3. 关联项目标题与对应活动块(进阶)
如果MASTERFILE的结构是「项目标题 + 该项目的活动块」,可以用组合正则一次性提取项目及其对应的所有活动内容:
^## %(\S+) (.+)\n(?s)(.*?(CHRG=.+?<br>)+)
正则解释:
- 前半部分
^## %(\S+) (.+)\n:匹配并捕获项目标题行 (?s):开启单行模式处理跨行内容(.*?(CHRG=.+?<br>)+):捕获该项目下所有连续的活动块(.*?跳过标题后到第一个活动块前的无关文本,(CHRG=.+?<br>)+匹配一个或多个活动块)
常见问题修正(为什么之前会匹配无关内容?)
- 未启用多行模式:导致
^/$匹配整个文件的首尾,而非每行首尾,会误抓包含## %的长文本行 - 使用贪婪匹配
.+而非非贪婪.+?:会从第一个CHRG=一直匹配到文件最后一个<br>,把多个项目的活动块甚至无关内容都包含进来 - 未开启单行模式:如果活动块跨行,
.无法匹配换行符,会只抓取CHRG=所在行的内容,或者匹配失败
示例验证
假设MASTERFILE内容如下:
## %PRJ001 Website Redesign 项目前期准备:需求梳理 CHRG=2024-05-20, 4h, Frontend Development<br> CHRG=2024-05-20, 2h, Backend Integration<br> 无关的备注文本 ## %PRJ002 Mobile App Launch CHRG=2024-05-20, 3h, UI Testing<br> 临时会议记录(不属于活动块)
用上述正则提取后,会得到:
- 项目标题:
## %PRJ001 Website Redesign、## %PRJ002 Mobile App Launch - 对应活动块:
- PRJ001下的
CHRG=2024-05-20, 4h, Frontend Development<br>、CHRG=2024-05-20, 2h, Backend Integration<br> - PRJ002下的
CHRG=2024-05-20, 3h, UI Testing<br>
- PRJ001下的
完全不会包含“无关的备注文本”“临时会议记录”这类无关内容。
内容的提问来源于stack exchange,提问作者projetnumero9
相关产品推荐
相关产品推荐

