如何使用TCL删除字符串中的字符

时间:2015-02-16 09:45:20

标签: tcl

我有以下字符串

  

“TCL被称为”工具命令语言“,TCL被称为”工具   命令语言“,TCL被称为”工具命令语言“”

从上面的输入我想要一个像下面的输出

  

“TCL被称为工具命令语言,TCL被称为工具命令   语言,TCL被称为工具命令语言“

即。 only first and last double quotes should be displayed on output, and all other should be deleted,有人可以让我知道实现此目的的不同方法

3 个答案:

答案 0 :(得分:2)

可以有很多方法。我试过了regsub

set str {"TCL is known as "tool command language", TCL is known as "tool command language", TCL is known as "tool command language""}
puts "Input : $str"
regsub -all {(.)"} $str {\1} output
puts "Output : $output"

将生成以下内容

Input : "TCL is known as "tool command language", TCL is known as "tool command language", TCL is known as "tool command language""
Output : "TCL is known as tool command language, TCL is known as tool command language, TCL is known as tool command language"

我使用的模式是(.)"。在正则表达式中,原子.将匹配任何单个字符。 (将在底部讨论括号用法)。然后单引号。所以,基本上,这将匹配任何单个字符并且旁边有一个单引号,如下所示。

enter image description here

如您所见,我们共有6场比赛。让我们进行第二场比赛e"。我们的主要目的是删除引号。但是,我们匹配了2个字符。这就是我们将它与括号分组的原因。

使用Tcl,我们可以在\1和第二个子组\2的帮助下访问第一个子组,依此类推。最后,我们用一个字符替换2个字符,这个字符除了引号之外的第一个字母。即e"替换为字符e

注意在开头使用-all标志,负责匹配此模式的所有出现。

注意: \1应该像我提到的{\1}这样的大括号一起使用。如果您想要在没有大括号的情况下访问它,则必须使用\\1

参考:Non-capturing subpatterns

答案 1 :(得分:2)

您可以删除所有引号并重新添加外部引号。一种方式:

set new [format {"%s"} [string map {{"} {}} $str]]

答案 2 :(得分:1)

您试图从字符串中删除所有"个字符,每个字符至少有一个字符。这导致了这种正则表达式替换:

set transformedString [regsub -all {(.)[""]+(.)} $inputString {\1\2}]

"加倍并位于[方括号]中,只是为了突出显示在这里工作。您可以改为使用{(.)"+(.)}

相关问题