TCL:反斜杠问题(regsub)

时间:2013-10-21 13:06:41

标签: regex tcl backslash

我在尝试阅读\\server\directory等列表的成员时遇到问题 当我尝试使用lindex命令获取此变量时,会出现问题,该命令继续进行TCL替换,结果是:

\serverdirectory

然后,我认为我需要使用regsub命令来避免反斜杠替换,但是我没有得到正确的结果。

我想要的一个例子应该是:

set mistring "\\server\directory"
regsub [appropriate regular expresion here]
puts "mistring: '$mistring'"  ==> "mistring: '\\server\directory'"

我已经检查了一些这方面的帖子,并保持\\没问题,但是我仍然遇到问题,试图始终保持一个\,然后是可能来到这里的任何其他角色。< / p>

更新:具体示例。我实际上要保留的是列表中元素的初始格式。该列表由外部应用程序接收。原始代码是这样的:

set mytable $__outer_list_received
puts "Table: '$mytable'"
for { set i 0 } { $i < [llength $mitabla] } { incr i } {
   set row [lindex $mytable $i]
   puts "Row: '$row'"
   set elements [lindex $row 0]
   puts "Elements: '$elements'"
}

此输出,在这种情况下是:

Table: '{{
   address \\server\directory
   filename foo.bar
}}'
Row: '{
   address \\server\directory
   filename foo.bar
}'
Elements: '
   address \\server\directory
   filename foo.bar
'

因此,我尝试获取地址的值(在此特定情况下为\\server\directory),以便将其写入配置文件中,保留原始格式和数据。 我希望这能澄清问题。

3 个答案:

答案 0 :(得分:1)

如果您不想要替换,请将有问题的字符串放在花括号内。

% puts "\\server\directory"
\serverdirectory

并不是你想要的。但

% puts {\\server\directory}
\\server\directory

根据需要。

答案 1 :(得分:0)

由于这在Windows上基本上是一个问题(并且Tcl总是将双引号中的反斜杠视为执行转义替换的指令),您应该考虑采用不同的方法(否则您会遇到反斜杠消失的问题)你可以应用代码来“修复”它们。幸运的是,你有两个替代方案。第一种是将字符串放在{大括号}中以禁用替换,就像C#逐字字符串文字(但使用@"而不是")。第二种可能更合适:

set mistring [file nativename "//server/directory"]

确保在Windows上使用平台本机目录分隔符(现在在其他平台上什么都不做;当支持旧的MacOS9时,它更加神奇)。通常情况下,如果要向用户显示完整路径名(通常是一个坏主意,GUI方式),或者如果您将名称传递给某些不喜欢正斜杠的API(特别是当作为通过exec对程序的参数,但还有其他地方泄漏细节,例如,如果您使用的是dde,tcom或twapi包。)

答案 2 :(得分:0)

第三个,虽然丑陋,但选择是加倍斜线。 \\而不是\,和\而不是\,同时使用双引号。当替换发生时,它应该给你你想要的。当然,如果你再次进行替换,这将无济于事。