如何使用单个正则表达式匹配多行内容并提取男性及其宠物数据
问题描述
我有一个包含多条人员数据的文件,内容如下:
person: male
Pet : dog, cat,
person: female
pet : dog, pig
文件中存在大量此类人员数据,我希望仅提取男性人员及其对应的宠物数据,期望结果如下:
person: male
Pet : dog, cat,
我尝试通过匹配两行内容来实现,但当前代码无法正常工作,代码如下:
while{[gets $fh line] > 0} { if {[regexp {(person: male.*) (pets :.*)} $line match submatch]} { puts $match puts $submatch } }
解决方案
你的代码有几个核心问题导致失效:
gets $fh line每次仅读取单行数据,但你写的正则试图匹配两行内容,完全不匹配读取逻辑;- 正则里的
pets :.*存在拼写错误(文件里是pet,正则多写了s),同时没处理Pet/pet的大小写差异; - 没有建立"匹配男性后捕获对应宠物行"的关联逻辑。
可以改成基于状态标记的逐行处理逻辑,代码如下:
set capture_pet 0 while {[gets $fh line] > 0} { # 匹配男性人员行,忽略大小写适配不同写法 if {[regexp -nocase {person: male} $line]} { puts $line set capture_pet 1 ;# 标记下一行需要捕获对应宠物 } elseif {$capture_pet} { # 匹配宠物行,忽略大小写 if {[regexp -nocase {pet :.*} $line]} { puts $line set capture_pet 0 ;# 捕获完成后重置标记 } } }
代码说明
-nocase参数用来兼容文件中Pet/pet的大小写差异;capture_pet作为状态标记,确保只捕获男性对应的那一行宠物数据,不会误抓其他条目;- 逻辑贴合逐行读取的场景,比跨行正则更稳定易维护。
内容的提问来源于stack exchange,提问作者flash
相关产品推荐
相关产品推荐

