在字符串中间使用正则表达式转义大括号

时间:2014-06-08 09:22:08

标签: regex tcl

我想在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 

2 个答案:

答案 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