【问题标题】:TCL: Backslash issue (regsub)TCL:反斜杠问题(regsub)
【发布时间】:2013-10-28 09:02:08
【问题描述】:

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

\serverdirectory

然后,我想我需要使用regsub 命令来避免反斜杠替换,但我没有得到正确的过程。

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

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

我已经检查了一些与此相关的帖子,并保留 \\ 是可以的,但当我尝试始终保留一个 \ 后跟任何其他可能出现的字符时,我仍然遇到问题。

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

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),以便将其写入配置文件,保持原始格式和数据。 我希望这能澄清问题。

【问题讨论】:

    标签: regex tcl backslash


    【解决方案1】:

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

    % puts "\\server\directory"
    \serverdirectory
    

    这不是你想要的。但是

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

    如你所愿。

    【讨论】:

    • Tnaks 的答案,问题是我不能直接使用花括号打印,因为我直接从使用 lindex 的列表中接收到这个变量。在这种情况下,如果我尝试将 puts 与变量名一起使用,则输出就是变量名本身。那么有没有办法使用 puts 打印带有 {} 的变量的内容?这当然是最简单的解决方案。
    • 那么,问题是你的列表是在哪里定义的。再举一个例子,如果您使用lindex "l1 l2 \\server\directory l3" 2,它将不起作用;但如果你使用lindex {l1 l2 \\server\directory l3} 2,它会的。
    • 我的意思是:在你的程序中的某个地方,你会有类似set mylist [list l1 l2 \\server\directory l2] 的东西,而在其他地方,你有lindex $mylist 3。然后,如果你使用set mylist [list l1 l2 {\\server\directory} l3],它就会起作用。
    • 你是完全正确的。不幸的是,我没有直接在我的程序上设置初始列表,我没有控制这个列表,而是从外部应用程序接收它作为参数(这实际上是问题......)。有什么想法吗?有没有办法以某种方式读取与 lindex 不同或避免这种反斜杠替换?
    • 澄清一下,解决方法是您的解决方案的混合。当然,将列表视为字符串(实际上是什么)是第一步。我没有使用 split 命令进行拆分,而是使用正则表达式来解决它并避免烦人的空格元素等,这里有一个与此问题相关的帖子:stackoverflow.com/questions/3020690/… 谢谢你的帮助! :)
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-25
        • 1970-01-01
        • 2020-12-25
        • 1970-01-01
        相关资源
        最近更新 更多