regex 限制regsub命令的数量以删除空格、行尾或列表中的回车

vlf7wbxs  于 2023-01-18  发布在  其他
关注(0)|答案(2)|浏览(110)

我的列表:

set myList "{ 
                {key value} {key1 value1}
                {
                    {key2 value2} {key3 value3}
                }
            }"

预期输出:

{{key value} {key1 value1} {{key2 value2} {key3 value3}}}

目前为止我尝试的方法是:

set myList  [string trim $myList]
set newList [string map {\n "" \t " "} $myList]

regsub -all {^\{\s+\{} $newList "{{"  newList ; # start of list
regsub -all {\}\s+\}$} $newList "}}"  newList ; # end of list
regsub -all {\}\s+\{}  $newList "} {" newList ; # middle of list
regsub -all {\{\s+\{}  $newList "{{"  newList ; # middle of list again
regsub -all {\}\s+\}}  $newList "}}"  newList ; # middle of list again and again

它的工作,但我已经使用了许多regsub命令。有可能限制他们吗?或不同的方法,没有regsub ...

olmpazwi

olmpazwi1#

首先,在Python 8.6中使用regsub需要两个脚本,其中一个明显很难看(使用lookaheads):

regsub -all {(\{)\s+(?=[{}])|(\})\s+(?=\})} [regsub -all {(\})\s+(?=\{)} $myList {\1 }] {\1\2}

在8.7中,您可以使用-command选项(因为在某些情况下您需要不同的取代基)来处理RE,但RE本身会更难看。
没有regsub也可以实现,但前提是您知道要规范化的深度(即,逻辑结构是什么);对于您来说,两次就足够了:

lmap item $myList {
    lmap subitem $item {
        list {*}$subitem
    }
}

命令list {*}$thingconcat $thing非常相似,除了它是一个适当的列表原生命令。concat * 不是 *(我们有测试用例来证明这一点)。

vh0rcniy

vh0rcniy2#

这将删除每行的前导/尾随空格以及换行符

regsub -all -line {(^\s+)|(\s+$)|\n} $myList ""
# => {{key value} {key1 value1}{{key2 value2} {key3 value3}}}

不过,它确实删除了子列表之间的空格。

regsub -all -line {(^\s+)|(\s+$)|\n} $myList "" flattened
regsub -all {\}\{} $flattened "} {"
# => {{key value} {key1 value1} {{key2 value2} {key3 value3}}}

相关问题