regsub
regsub ?switches? exp str subSpec ?varName?
基于正则表达式匹配执行替换。将正则表达式exp与字符串str匹配,并将str复制到名为varName的变量中。如果未指定varName则返回str。在str复制的过程中,str中匹配exp的字符串将被subSpec替换。如果subSpec中包含&”或“\0”,则使用str中匹配exp的字符串替换“&”和“\0”。如果subSpec包含“\n”(n为1到9的整数),则使用str中与exp第n个圆括号匹配的字符串进行替换。可以通过在“&”、“\0”、“\n”和“\”前加反斜杠“\”来防止特殊转义。subSpec中使用反斜杠经常会影响Tcl解析器的反斜杠使用,所以如果subSpec中使用反斜杠,通常用大括号括起来。
如果regsub的参数以“-”开始,则视为开关,支持的开关如下:
开关 | 说明 |
-all | 找到所有与exp匹配的字符串并对每个匹配项执行替换。如果不使用此开关,则只替换一个匹配的字符串。如果使用此开关则使用对应的匹配信息对每个替换出路“&”和“\n”序列。 |
-expanded | 启用正则表达式扩展语法,与regexp相同。 |
-line | 开启行敏感匹配,与regexp相同。 |
-linestop | 与regexp相同。 |
-lineanchor | 与regexp相同。 |
-nocase | 匹配时不区分大小写,但是替换时subSpec使用未转换的字符串。 |
-start index | 指定匹配正则表达式的字符串str的起始位置,与regexp相同。 |
-- | 标记开关结束。后面的参数将被视为exp,即使它以-开头。 |
简单示例
set multiline a\nAb\nAcb\nc
regsub a.*b $multiline ad& test
puts $test
regsub -all -nocase a.*?b $multiline ad&
regsub -line -all -nocase a.*b $multiline ad&
regsub -nocase -- -a(.*)c -Abcde xxx\\1yyy