Regsub 用于 set text [join $text \n] for missing brace error

Regsub use for set text [join $text \n] for missing brace error

我缺少该行的右大括号错误

set text [join $text \n] 我的整个代码是

proc ProcessText { text} {
   regsub -all -- ({) $text {\{} text 
   set text [join $text  \n]
   return $text
}

##it starts from here
set text "{a b c"
puts $text
puts [ProcessText $text]    

如果我使用 regsub 将 { 替换为任何不会引发错误的适当替换,我会收到错误 "Missing close-brace while executing"proc ProcessText {}"

如果我评论 regsub 然后我得到错误 “执行时列表中不匹配的左括号 "join $text \n" 谁能在这里建议我如何在 tcl 中进行同样的操作。

仅供参考: text 是一个包含大量文本信息的列表,如果我删除 {.它在其他方面不起作用。

正如 Donal 已经感觉到的,变量 text 所持有的值的格式不符合 Tcl 列表,但是 [join] 却希望如此。

您的选择是:

1) 使用 [split]:

将值转换为 Tcl 列表
join [split $text] \n

2) 使用 [string map]:

避免转换成列表和 [join]
string map {" " "\n"} $text

(或者使用 [regsub] 如下,如果你不能控制输入中的白色-space扩散)

有时,一个字符串最好只保留一个字符串 ;)

变体

你对 [regsub] 的使用是有问题的,最重要的是,最好使用它一次来实现你的最终目标,而不是在调用 [join]:

之前清理输入字符串
 regsub -all {\s+} $text "\n"

背景

你运行出错是因为你没有将正则表达式({)中的哨兵{转义为[regsub]正确:

regsub -all -- ({) $text {\{} text

这应该是:

regsub -all -- {\{} $text {\{} text

在您的变体中,{ 被视为左大括号,实际上在脚本的其余部分中不匹配。