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

Tcl中如何修改正则表达式 正确解析文本行提取目标前缀片段

Tcl正则解析OID前缀修复方案

问题场景

待解析原始文本行:

1.3.6.1.4.1.2076.50.3.1.3.2   2  
1.3.6.1.4.1.2076.50.3.1.4.1   64      127.0.0.101

原有解析代码:

while {[gets $in line] != -1} {
    
     regexp {(.*\.)\d+} $line -> line 
     puts "$line \n" }

原有代码运行结果(不符合预期):

1.3.6.1.4.1.2076.50.3.1.3.       ---> 末尾残留不需要的"."字符
1.3.6.1.4.1.2076.50.3.1.4.1   64      127.0.0. -----> 错误匹配后续IP相关无关内容

目标提取结果:

1.3.6.1.4.1.2076.50.3.1.3 
1.3.6.1.4.1.2076.50.3.1.4

错误原因

原有正则(.*\.)\d+存在两处缺陷:

  • .*为贪婪匹配模式,会尽可能匹配最长符合规则的字符串,因此第二行中会跨字段匹配到后续IP段的内容
  • 捕获组包含了OID最后一段前的.字符,导致提取结果末尾残留多余点号

修复代码

推荐使用分步匹配逻辑,从根源规避跨字段匹配问题,先提取行首独立的OID字段,再截断最后一段即可:

while {[gets $in line] != -1} {
    # 提取行首连续非空白字符,即完整OID字段,排除后续数值、IP等无关内容
    regexp {^(\S+)} $line oid
    # 移除OID末尾的点号+最后一段数字,得到目标前缀
    regsub {\.\d+$} $oid "" res
    puts $res
}

如果需要单条正则实现,也可以使用如下写法:

while {[gets $in line] != -1} {
    regexp {^(\d[\d.]+)\.\d+\s} $line -> res
    puts $res
}

两种写法都可以准确得到预期结果,第一种分步写法逻辑更清晰,后续维护成本更低。

内容的提问来源于stack exchange,提问作者Angie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 00:57:54