Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tcl 如何使用regsub查找和替换字符串的第二次出现_Tcl - Fatal编程技术网

Tcl 如何使用regsub查找和替换字符串的第二次出现

Tcl 如何使用regsub查找和替换字符串的第二次出现,tcl,Tcl,我是tcl的新手,正在努力学习,下面需要帮助。 我的字符串看起来像在configFileBuf中,并试图用XYZ替换ConfENB:local udp port>31001“的第二次出现,但在下面的regsub cmd中,我尝试过的总是替换为第一次出现(37896)。Plz帮助如何用XYZ替换第二次出现 set ConfigFileBuf "<ConfENB:virtual-phy> </ConfENB:local-ip-addr>

我是tcl的新手,正在努力学习,下面需要帮助。 我的字符串看起来像在configFileBuf中,并试图用XYZ替换ConfENB:local udp port>31001“的第二次出现,但在下面的regsub cmd中,我尝试过的总是替换为第一次出现(37896)。Plz帮助如何用XYZ替换第二次出现

set ConfigFileBuf "<ConfENB:virtual-phy>
            </ConfENB:local-ip-addr>
                    <ConfENB:local-udp-port>37896</ConfENB:local-udp-port>
            </ConfENB:local-ip-addr>
                    <ConfENB:local-udp-port>31001</ConfENB:local-udp-port>
            </ConfENB:virtual-phy>"

regsub -start 1 "</ConfENB:local-ip-addr>\[ \n\t\]+<ConfENB:local-udp-port>\[0-9 \]+</ConfENB:local-udp-port>" $ConfigFileBuf "XYZ" ConfigFileBuf
puts $ConfigFileBuf
设置ConfigFileBuf”
37896
31001
"
regsub-开始1“\[\n\t\]+\[0-9\]+”$ConfigFileBuf“XYZ”ConfigFileBuf
放入$ConfigFileBuf

如果您的字符串是格式良好的XML,我建议使用类似于tDOM的方法来操作它。DOM样式的操作几乎总是比基于XML标记的正则表达式操作好。(我提到这一点是因为它实际上应该是XML,而您只是错误地引用了它。)

看起来您正试图使用
-start 1
告诉
regsub
跳过第一个匹配。起始索引实际上是一个字符索引,因此在此调用中,
regsub
将跳过字符串中的第一个字符。您可以将
-start
进一步设置到字符串中,但除非使用
regexp
计算第一次匹配的结束位置

我认为最好的解决方案是通过调用
regexp
-all-inline-indexs
来获得要匹配的索引列表,使用
lindex
选择第二个索引对,最后使用
string replace
执行替换,如下所示:

set pattern {</ConfENB:local-ip-addr>[ \n\t]+<ConfENB:local-udp-port>[0-9 ]+</ConfENB:local-udp-port>}
set matches [regexp -all -inline -indices -- $pattern $ConfigFileBuf]
set match [lindex $matches 1]
set ConfigFileBuf [string replace $ConfigFileBuf {*}$match XYZ]
顺便说一句,请注意,如果使用大括号而不是双引号引用正则表达式,则可以避免转义,例如,正则表达式中的字符集


文档链接:,

您必须使用
regexp-indexs
找到替换的开始位置,然后才使用
regsub
。如果将正则表达式放在它自己的变量中,那还不错

set RE "</ConfENB:local-ip-addr>\[ \n\t\]+<ConfENB:local-udp-port>\[0-9 \]+</ConfENB:local-udp-port>"
set start [lindex [regexp -all -indices -inline $RE $ConfigFileBuf] 1 0]
regsub -start $start RE $ConfigFileBuf "XYZ" ConfigFileBuf
set RE "</ConfENB:local-ip-addr>\[ \n\t\]+<ConfENB:local-udp-port>\[0-9 \]+</ConfENB:local-udp-port>"
set start [lindex [regexp -all -indices -inline $RE $ConfigFileBuf] 1 0]
regsub -start $start RE $ConfigFileBuf "XYZ" ConfigFileBuf
set RE "</ConfENB:local-ip-addr>\[ \n\t\]+<ConfENB:local-udp-port>\[0-9 \]+</ConfENB:local-udp-port>"
set relen [expr {1 + [lindex [regexp -about $RE] 0]}]
set start [lindex [regexp -all -indices -inline $RE $ConfigFileBuf] $relen 0]
regsub -start $start RE $ConfigFileBuf "XYZ" ConfigFileBuf