是否可以使用 regsub 在表达式中进行不同的替换?
例子:
set a ".a/b.c..d/e/f//g"
现在,在这个表达式中,是否可以在单个 regsub 命令中将" " as " " " " 替换.
为 " yes
" " ..
" as " no
" " " /
as " " ?true
//
false
用regsub
, 不。对这类事情有一个长期存在的功能要求(需要用对匹配信息评估命令的结果进行替换),但迄今为止尚未采取行动。
但是在这种情况下,您可以使用string map
它来做您想做的事情:
set a ".a/b.c..d/e/f//g"
set b [string map {".." "no" "." "yes" "//" "false" "/" "true"} $a]
puts "changed $a to $b"
# changed .a/b.c..d/e/f//g to yesatruebyescnodtrueetrueffalseg
请注意,在构建地图时,如果任何 from-value 是另一个的前缀,则应将较长的 from-value 放在第一位。(这是因为string map
实现会按照您列出它们的顺序检查要进行的更改……)
可以在两步过程中使用regsub
和subst
执行多目标替换,但我不建议在非常复杂的情况下使用它!一个 nicestring map
更容易使用。
你也可以尝试自己做。proc
这是您可以用作起点的草稿。它还没有准备好生产,你必须小心,因为第一个替换后的替换对已经替换的字符串起作用。
这些是参数:
options
是将传递给每次调用的选项列表regsub
resubList
是键/值对的列表,其中键是正则表达式,值是替换string
是您要替换的字符串这就是过程,它只是简单地调用regsub
了多次,对其中的每个元素调用一次,resubList
最后,它返回最终的字符串。
proc multiregsub {options resubList string} {
foreach {re sub} $resubList {
set string [regsub {*}$options -- $re $string $sub]
}
return $string
}