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

如何使用TCL删除字符串中的字符,tcl,Tcl,我有以下字符串 TCL被称为“工具命令语言”,TCL被称为“工具命令语言” 命令语言”,TCL称为“工具命令语言” 从上面的输入,我想要一个如下的输出 “TCL被称为工具命令语言,TCL被称为工具命令 语言,TCL被称为“工具命令语言” i、 e.输出中只应显示第一个和最后一个双引号,所有其他双引号都应删除,有人能告诉我实现这一点的不同方法吗。我已尝试使用regsub set str {"TCL is known as "tool command language", TCL is known

我有以下字符串

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

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

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


i、 e.
输出中只应显示第一个和最后一个双引号,所有其他双引号都应删除,
有人能告诉我实现这一点的不同方法吗。我已尝试使用
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"
我使用的模式是
(.)“
。在正则表达式中,atom
将匹配任何单个字符。(将在底部讨论括号用法)。然后是一个单引号。因此,基本上,这将匹配任何单个字符,并在其旁边有一个单引号,如下所示

如您所见,我们总共有6个匹配项。让我们看第二个匹配项,即
e“
。我们的主要目的是删除这些引用。但是,我们匹配了两个字符。这就是我们用括号将其分组的原因

使用
Tcl
,我们可以借助
\1
访问第一个子组,借助
\2
访问第二个子组,依此类推。最后,我们用一个字符替换这两个字符,这个字符只不过是引号以外的第一个字母。i、 e.
e“
替换为字符
e

请注意,开头使用了
-all
标志,该标志负责匹配此模式的所有匹配项

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

参考:

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

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

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

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

是加倍的,放在
[
括号
]
中只是为了突出显示。你可以用
{(.)+(.)}
来代替。

嗨,迪内什,你能告诉我它是如何匹配六次的,然后它是如何被替换的吗pattern@velpandian:我已经更新了我的答案。请检查。Dinesh感谢您的快速回复,正如您所说,(.)将匹配任何一个字符,然后“应该在那里。我的问题是,如果您看到输入字符串的结尾以语言“”结尾,那么在这里,在这个特定区域e和“”中应该有2个匹配项“但我们在这一领域有1场比赛,你能澄清一下这一部分吗?”。。Thanks@velpandian:模式匹配后,它将向前移动到下一个字符,并尝试查找是否能够匹配剩余的可用文本。。因此,最后一句话,在
e”
之后,我们只剩下一个不符合我们标准的双引号。嗨,多纳尔,你能解释一下这种替换是如何工作的吗?请告诉我任何regsub文档,我对regexp有基本的了解