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

求助:修正Tcl代码以通过正则表达式提取目标索引值

问题描述

需要从含ROUTED关键字的文件行中提取括号内的四个值,目标行格式如下:

+ ROUTED M12 10000 + SHAPE STRIPE ( 69768 89000 ) ( 95146 * )

四个值对应:Vxx=69768、Vxy=89000、Vyx=95146、Vyy=*。

编写的Tcl代码如下:

set input_file [open "M12_expt.def" r]
set output_file [open "M12_expt_newloc.def" w]

while {[gets $input_file line] >=0} {
    if {[string match {*ROUTED*} $line]} {

set start [expr {[string first "(" $line] + 1}]
    set end [string last ")" $line]
    set values [string range $line $start $end]
    set vlist [regexp -inline {\d+|\*} $values]
puts $vlist
    set vxx [lindex $vlist 0]
    set vxy [lindex $vlist 1]
    set vyx [lindex $vlist 2]
    set vyy [lindex $vlist 3]
    puts "vxx $vxx"
    puts "vxy $vxy"
    puts "vyx $vyx"
    puts "vyy $vyy" 
  }
}

预期输出:

vxx 69768
vxy 89000
vyx 95146
vyy *

实际输出:

vxx 69768
vxy 
vyx 
vyy 
问题排查与修正

问题根源

regexp -inline命令默认仅返回第一个匹配的结果,未添加-all选项时,vlist仅包含单个元素,后续通过lindex取索引1、2、3的元素自然为空。

修正后的代码

在regexp命令中添加-all选项,即可获取所有匹配值,同时补充文件关闭命令避免资源泄漏:

set input_file [open "M12_expt.def" r]
set output_file [open "M12_expt_newloc.def" w]

while {[gets $input_file line] >=0} {
    if {[string match {*ROUTED*} $line]} {
        set start [expr {[string first "(" $line] + 1}]
        set end [string last ")" $line]
        set values [string range $line $start $end]
        # 添加 -all 选项,获取所有匹配的结果
        set vlist [regexp -all -inline {\d+|\*} $values]
        puts $vlist
        set vxx [lindex $vlist 0]
        set vxy [lindex $vlist 1]
        set vyx [lindex $vlist 2]
        set vyy [lindex $vlist 3]
        puts "vxx $vxx"
        puts "vxy $vxy"
        puts "vyx $vyx"
        puts "vyy $vyy" 
    }
}

close $input_file
close $output_file

验证结果

修正后运行代码,即可得到预期的四个值输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:24:28