使用tcl-regexp获取多个匹配项



如何使用regexp命令获取tcl中的所有匹配项?例如,我有一个字符串如下

set line "foo "aaa"zz bar "aaa:ccc" ccc"
puts $line
foo "aaa"zz bar "aaa:ccc" ccc

我现在想要得到aaaaaa:ccc。这样的比赛可能有很多。我试过

regexp -all -inline {"(.*)"} $line 
{"aaa"zz bar "aaa:ccc"} {aaa"zz bar "aaa:ccc}

但正如所见,这并没有奏效。获得多个匹配项并在双引号内匹配所有内容的正确方法是什么?

您可以使用"([^"]*)"模式捕获两个引号之间的所有引号。使用带有regexp -all -inline:的图案时

set matches [regexp -all -inline {"([^"]*)"} $line]

您将获得所有的整体匹配值和所有捕获的子字符串。

你必须对比赛进行后期处理才能获得最终的捕获列表:

set line "foo "aaa"zz bar "aaa:ccc" ccc"
set matches [regexp -all -inline {"([^"]*)"} $line]
set res {}
foreach {match capture} $matches {
lappend res $capture
}
puts $res

请参阅在线Tcl演示。

输出:

aaa aaa:ccc

提取带引号字符串的另一种方法是:

set unquoted [lmap quoted [regexp -all -inline {".*?"} $line] {string trim $quoted {"}}]

或者,使用引号作为分隔符拆分字符串,并每隔秒使用字段。

set unquoted [lmap {a b} [split $line {"}] {set b}]

这将为您提供一个尾随的空元素,因为此split调用会导致一个包含奇数个元素的列表。

最新更新