Tcl正则表达式:提取所有元素



>我有如下简单的字符串:

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

我做错了什么?

谢谢。

-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丢弃这些主体脚本结果。

最新更新