Tcl 用两个字符分隔符拆分
在tcl(8.4版)中,我想拆分如下字符串: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
"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的答案更可靠