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
相关产品推荐
相关产品推荐

