我有以下字符串
“TCL被称为”工具命令语言“,TCL被称为”工具 命令语言“,TCL被称为”工具命令语言“”
从上面的输入我想要一个像下面的输出
“TCL被称为工具命令语言,TCL被称为工具命令 语言,TCL被称为工具命令语言“
即。 only first and last double quotes should be displayed on output, and all other should be deleted,
有人可以让我知道实现此目的的不同方法
答案 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"
我使用的模式是(.)"
。在正则表达式中,原子.
将匹配任何单个字符。 (将在底部讨论括号用法)。然后单引号。所以,基本上,这将匹配任何单个字符并且旁边有一个单引号,如下所示。
如您所见,我们共有6场比赛。让我们进行第二场比赛e"
。我们的主要目的是删除引号。但是,我们匹配了2个字符。这就是我们将它与括号分组的原因。
使用Tcl
,我们可以在\1
和第二个子组\2
的帮助下访问第一个子组,依此类推。最后,我们用一个字符替换2个字符,这个字符除了引号之外的第一个字母。即e"
替换为字符e
。
注意在开头使用-all
标志,负责匹配此模式的所有出现。
注意: \1
应该像我提到的{\1}
这样的大括号一起使用。如果您想要在没有大括号的情况下访问它,则必须使用\\1
答案 1 :(得分:2)
您可以删除所有引号并重新添加外部引号。一种方式:
set new [format {"%s"} [string map {{"} {}} $str]]
答案 2 :(得分:1)
您试图从字符串中删除所有"
个字符,每个字符至少有一个字符。这导致了这种正则表达式替换:
set transformedString [regsub -all {(.)[""]+(.)} $inputString {\1\2}]
"
加倍并位于[
方括号]
中,只是为了突出显示在这里工作。您可以改为使用{(.)"+(.)}
。