我想将引号内的文本放入列表中。它可能是单库特或双库特。
ex_string :
( "abc_|a'b" |"BDA" |"BB- 'DS" |"啊"(! ='-- 确定' : 文本= 'abc')
我希望列表像
{abc_|a'b} {bda} {bb- 'ds} {aac} {-- ok} {abc}
这是正则表达式可以解决的问题。但是,您必须对结果进行后处理(在这种情况下,lmap
和string cat
非常适合该任务):
set str {( "abc_|a'b" | 'bda' | "bb- 'ds" | 'aac'(!) = '-- ok' : text= 'abc')}
set items [lmap {a b c} [regexp -all -inline {"([^"]*)"|'([^']*)'} $str] {
string cat $b $c
}]
puts "found: $items"
# found: abc_|a'b bda {bb- 'ds} aac {-- ok} abc
不需要它的物品周围没有大括号。我希望你平时能接受...
你可以这样做:
% set a {( "abc_|a'b" | 'bda' | "bb-'ds" | 'aac'(!) = '--ok')}
( "abc_|a'b" | 'bda' | "bb-'ds" | 'aac'(!) = '--ok')
% set b [string trim $a {() }]
"abc_|a'b" | 'bda' | "bb-'ds" | 'aac'(!) = '--ok'
% set c [string map {{ | } { } { = } { } {(!)} {}} $b]
"abc_|a'b" 'bda' "bb-'ds" 'aac' '--ok'
% concat {*}[lmap item $c {format "{%s}" [string trim $item {"'}]}]
{abc_|a'b} {bda} {bb-'ds} {aac} {--ok}
如有必要,我稍后会解释。
文档: 康卡特, 格式 lmap(对于Tcl 8.5), LMAP, 设置 字符串 {*}(语法)
类似于Donal Fellows的答案,但使用非贪婪的正则表达式:
set str {( "abc_|a'b" | 'bda' | "bb- 'ds" | 'aac'(!) = '-- ok' : text= 'abc')}
set items [lmap {- - s} [regexp -all -inline {(['"])(.*?)1} $str] {set s}]
puts "found: $items"
# found: abc_|a'b bda {bb- 'ds} aac {-- ok} abc