如何使用tcl命令在引号内获取文本并存储在列表中

时间:2017-05-09 07:22:20

标签: tcl

我想将引号内的文本放入列表中。它可能是单一或双重qoutes。

ex_string:

( "abc_|a'b" | 'bda' | "bb-  'ds" | 'aac'(!)     = '--  ok' : text= 'abc')

我希望列表像

{abc_|a'b} {bda} {bb-  'ds} {aac} {-- ok} {abc}

3 个答案:

答案 0 :(得分:2)

这是正则表达式可以解决的问题。但是,您必须对结果进行后期处理(lmapstring 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

对于不需要它的物品,没有任何支撑。我希望你通常能做到这一点......

答案 1 :(得分:1)

你可以这样做:

% 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}

如果有必要,我稍后会解释。

文档: concatformatlmap (for Tcl 8.5)lmapsetstring{*} (syntax)

答案 2 :(得分:1)

类似于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