Tcl 用两个字符分隔符拆分

Tcl 用两个字符分隔符拆分,tcl,Tcl,在tcl(8.4版)中,我想拆分如下字符串: "param1=>someval param2=>anotherval" 分为两个列表,例如: params = param1 param2 values = someval anotherval 如果它是单个分隔符,例如=,我可以使用split命令。双字符分隔符是否有等效项?您可以使用它来获取参数/值对,例如: set text "param1=>someval param2=>anotherval" set param

在tcl(8.4版)中,我想拆分如下字符串:

"param1=>someval param2=>anotherval"
分为两个列表,例如:

params = param1 param2
values = someval anotherval
如果它是单个分隔符,例如
=
,我可以使用
split
命令。双字符分隔符是否有等效项?

您可以使用它来获取参数/值对,例如:

set text "param1=>someval param2=>anotherval"
set params [list]
set values [list]

foreach {all param value} [regexp -all -inline -- {(\S+)=>(\S+)} $text] {
    lappend params $param
    lappend values $value
}

puts $params
puts $values
# => param1 param2
# => someval anotherval

regexp
(\S+)
捕获一系列非空格字符(包括非换行符和类似字符),因此如果参数和值包含空格,则必须修改模式(请参阅)。如果其中没有空格,则上述操作应该不会出现任何问题


如果要拆分两次,即在空格上拆分一次,然后在
=>
上拆分一次,那么我建议在空格中使用一个:

set text "param1=>someval param2=>anotherval"
set list [split $text]

set params [list]
set values [list]

foreach elem $list {
    set newElem [string map {=> \0} $elem]
    set pair [split $newElem \0]
    lappend params [lindex $pair 0]
    lappend values [lindex $pair 1]
}

puts $params
puts $values
# => param1 param2
# => someval anotherval
在这里,我们将在
=>
上拆分的字符替换为null
\0
(这是一个不太可能出现在正常字符串中的字符),然后在null上拆分。

您可能可以使用来获取参数/值对,例如:

set text "param1=>someval param2=>anotherval"
set params [list]
set values [list]

foreach {all param value} [regexp -all -inline -- {(\S+)=>(\S+)} $text] {
    lappend params $param
    lappend values $value
}

puts $params
puts $values
# => param1 param2
# => someval anotherval

regexp
(\S+)
捕获一系列非空格字符(包括非换行符和类似字符),因此如果参数和值包含空格,则必须修改模式(请参阅)。如果其中没有空格,则上述操作应该不会出现任何问题


如果要拆分两次,即在空格上拆分一次,然后在
=>
上拆分一次,那么我建议在空格中使用一个:

set text "param1=>someval param2=>anotherval"
set list [split $text]

set params [list]
set values [list]

foreach elem $list {
    set newElem [string map {=> \0} $elem]
    set pair [split $newElem \0]
    lappend params [lindex $pair 0]
    lappend values [lindex $pair 1]
}

puts $params
puts $values
# => param1 param2
# => someval anotherval

在这里,我们将在
=>
上拆分的字符替换为null
\0
(这是一个不可能出现在正常字符串中的字符),然后在null上拆分。

Jerry的方法很棒。这也可以通过使用
scan
来实现

set input "param1=>someval param2=>anotherval"

foreach element $input { 
    if {  [ scan $element {%[^=>]=>%s} p v ] == 2 } { 
        puts $p
        puts $v
    } else { 
        puts "Scan failed for param and value. :("
    }
}

在这里,我利用了Tcl的列表实现,因为它是一个用空格分隔的列表。如果输入没有空格,则必须自定义
scan
命令。

Jerry的方法很棒。这也可以通过使用
scan
来实现

set input "param1=>someval param2=>anotherval"

foreach element $input { 
    if {  [ scan $element {%[^=>]=>%s} p v ] == 2 } { 
        puts $p
        puts $v
    } else { 
        puts "Scan failed for param and value. :("
    }
}

在这里,我利用了Tcl的列表实现,因为它是一个用空格分隔的列表。如果输入没有空格,则必须自定义
scan
命令。

尝试tcllib中的textutil包:


它有一个名为
::textutil::splitx
的过程,可以满足您的需要。

尝试tcllib中的textutil包:


它有一个名为
::textutil::splitx
的过程,可以满足您的需要。

您可以这样做:

set text "param1=>someval param2=>anotherval"

foreach {p v} [string map {=> { }} $text] {
    lappend params $p
    lappend values $v
}

set params
# => param1 param2
set values
# => someval anotherval
通过将
=>
子字符串替换为空格,可以得到一个大小相等的列表,其中每个其他元素都是参数名称字符串,每个其他元素都是值字符串。这是假设参数名称或值内没有任何空格


文档:,

您可以这样做:

set text "param1=>someval param2=>anotherval"

foreach {p v} [string map {=> { }} $text] {
    lappend params $p
    lappend values $v
}

set params
# => param1 param2
set values
# => someval anotherval
通过将
=>
子字符串替换为空格,可以得到一个大小相等的列表,其中每个其他元素都是参数名称字符串,每个其他元素都是值字符串。这是假设参数名称或值内没有任何空格


文档:,

实际上,
字符串映射可能更好;要替换的是文本字符串,而不是复杂的模式。同意。太多的regexp:我认为regexp非常优雅,因为它不需要进一步的特殊处理就可以拒绝格式错误的输入;要替换的是文本字符串,而不是复杂的模式。同意。太多的regexp正在进行:我认为regexp非常优雅,因为它拒绝格式错误的输入,而无需进一步的特殊处理。谢谢。我没有在这个问题中指定任何外部库,但它足够简单,我不想仅仅为了这个问题而添加依赖项。谢谢。我没有在问题中指定任何外部库,但它很简单,我不想仅仅为这个问题添加依赖项。我喜欢这样,因为它试图处理错误。我喜欢这样,因为它试图处理错误,但不能很好地处理格式错误的输入,因此Dinesh的答案更健壮。优雅,但是不能很好地处理格式错误的输入,因此Dinesh的答案更可靠