我想在tcl中编写一个正则表达式,它可以检测字符串中间是否存在花括号({
,}
),并用反斜杠替换它。
例如i / p:
designs/abc/def {/designs/abc/def/abc{123}defg} {abc/sed/123erf} -conect abc
O / P:
designs/abc/def {/designs/abc/def/abc\{123\}defg} {abc/sed/123erf} -conect abc
答案 0 :(得分:1)
既然你提到只应该替换两侧字符所包围的大括号,那么我认为你需要字边界:
% set input "designs/abc/def {/designs/abc/def/abc{123}defg} {abc/sed/123erf} -conect abc"
designs/abc/def {/designs/abc/def/abc{123}defg} {abc/sed/123erf} -conect abc
% regsub -all {\y[{}]\y} $input {\\\0} result
2
% puts $result
designs/abc/def {/designs/abc/def/abc\{123\}defg} {abc/sed/123erf} -conect abc
在Tcl中,\y
与\w
之间的\W
匹配,即在单词和非单词字符之间或单词字符与字符串的开头/结尾之间。< / p>
替换\\\0
会产生反斜杠和匹配的字符串。
如果您还可以在字符串的开头/结尾处转义大括号,那么您需要一些不同的东西:
% set input "{/designs/abc/def/abc{123}defg}"
{/designs/abc/def/abc{123}defg}
% regsub -all {(?:\y|^)[{}](?:\y|$)} $input {\\\0} result
4
% puts $result
\{/designs/abc/def/abc\{123\}defg\}
答案 1 :(得分:0)
通常你可以使用环视来优雅,但你可以通过在输出中包含部分匹配来伪造它:将(\S)([{}])(\S)
替换为\1\\\2\3
。