如何减少regsub命令数量优化Tcl列表的空格/换行/回车清理?
优化Tcl列表紧凑格式化的实现
需求说明
现有一个包含换行、缩进的Tcl列表字符串:
set myList "{ {key value} {key1 value1} { {key2 value2} {key3 value3} } }"
需要将其转换为无多余空白的紧凑格式:
{{key value} {key1 value1} {{key2 value2} {key3 value3}}}
现有实现
当前代码通过多次regsub处理空白和括号,虽能实现需求,但正则替换调用次数较多:
set myList [string trim $myList] set newList [string map {\n "" \t " "} $myList] regsub -all {^\{\s+\{} $newList "{{" newList ; # 处理列表开头的嵌套括号 regsub -all {\}\s+\}$} $newList "}}" newList ; # 处理列表结尾的嵌套括号 regsub -all {\}\s+\{} $newList "} {" newList ; # 处理元素间的括号 regsub -all {\{\s+\{} $newList "{{" newList ; # 处理中间的嵌套左括号 regsub -all {\}\s+\}} $newList "}}" newList ; # 处理中间的嵌套右括号
优化方案
方案一:利用Tcl原生列表操作(完全无需regsub)
Tcl的列表机制本身支持解析和生成标准格式的列表,这是最简洁高效的方法:
set myList "{ {key value} {key1 value1} { {key2 value2} {key3 value3} } }" # 将字符串形式的列表解析为真实的Tcl列表对象 set actual_list [eval $myList] # 重新生成紧凑格式的列表字符串 set compact_list [list {*}$actual_list] # 输出结果即为期望的紧凑格式 puts $compact_list
原理:eval $myList会把带格式的字符串解析成Tcl原生列表,list {*}$actual_list则将列表元素重新组合为无多余空白的标准列表字符串,完全规避正则替换。
方案二:精简regsub调用次数
如果坚持用字符串处理,可将多次正则替换合并为2-3次:
set myList "{ {key value} {key1 value1} { {key2 value2} {key3 value3} } }" # 1. 去掉首尾空白,将所有连续空白(换行、制表、空格)替换为单个空格 set newList [regsub -all {\s+} [string trim $myList] " "] # 2. 一次性处理嵌套括号的多余空白({{和}}之间的空格) regsub -all {(\{)\s+(\{)|(\})\s+(\})} $newList {\1\3\2\4} newList # 3. 处理元素间的括号空格(确保} {之间只保留一个空格) regsub -all {\}\s+\{}} $newList "} {" newList puts $newList
原理:先统一空白格式,再用分支正则一次性处理所有嵌套括号的空格,最后调整元素间的括号间距,将原有的5次regsub减少为2次。
内容的提问来源于stack exchange,提问作者Mkn
相关产品推荐
相关产品推荐

