You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用单个正则表达式匹配多行内容并提取男性及其宠物数据

问题描述

我有一个包含多条人员数据的文件,内容如下:

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
}
}
解决方案

你的代码有几个核心问题导致失效:

  1. gets $fh line每次仅读取单行数据,但你写的正则试图匹配两行内容,完全不匹配读取逻辑;
  2. 正则里的pets :.*存在拼写错误(文件里是pet,正则多写了s),同时没处理Pet/pet的大小写差异;
  3. 没有建立"匹配男性后捕获对应宠物行"的关联逻辑。

可以改成基于状态标记的逐行处理逻辑,代码如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 02:45:10