1

是否可以使用 regsub 在表达式中进行不同的替换?

例子:

set a ".a/b.c..d/e/f//g"

现在,在这个表达式中,是否可以在单个 regsub 命令中将" " as " " " " 替换.为 " yes" " .." as " no" " " /as " " ?true//false

4

2 回答 2

9

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实现会按照您列出它们的顺序检查要进行的更改……)


可以在两步过程中使用regsubsubst执行多目标替换,但我不建议在非常复杂的情况下使用它!一个 nicestring map更容易使用。

于 2012-11-06T21:54:10.843 回答
2

你也可以尝试自己做。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
}
于 2012-11-07T08:41:59.803 回答