Tcl regexp:提取所有元素

时间:2018-01-07 15:05:40

标签: regex string tcl inline

我有如下的简单字符串:

set x "\ \ a\ b\ \ a\ b\ b\ a\ \ \ "  

我试图通过使用以下正则表达式来提取所有出现的“a”和“b”:

set match [regexp -all -inline {(\S+)} $x]

但这给了我:

a a b b a a b b b b a a

我在期待:

a b a b b a

我做错了什么?

感谢。

1 个答案:

答案 0 :(得分:2)

-all -inline选项组合使regexp返回找到的所有匹配和捕获子匹配的列表,而您的正则表达式包含恰好是的捕获子匹配和整场比赛一样。

试试这个:

set match [regexp -all -inline {\S+} $x]

如果您需要非捕获括号,请使用(?:…)代替(…)

如果您因为匹配更复杂的内容而必须拥有捕获组,则可以使用lmap(8.6或更高版本)或foreach过滤结果:

set match [lmap {matched ignored} [regexp -all -inline {(\S+)} $x] {
    set matched
}]
set match {}
foreach {matched ignored} [regexp -all -inline {(\S+)} $x] {
    lappend match $matched
}

请注意,我们在这里使用了两个迭代变量和一个列表,因此我们选择了两个元素。使用三个迭代变量将由三个等等进行选择(lmap命令就像foreach一样,除了它生成通过评估其主体脚本获得的值列表,而foreach抛出那些身体脚本结果消失了。)