求助:修正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
相关产品推荐
相关产品推荐

