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

Tcl regexp: extraction of all elements

我有如下简单的字符串:

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 return 成为所有匹配项的列表 并捕获它找到的子匹配项 ,以及您的常规表达式包含恰好与整个匹配相同的捕获子匹配。

试试这个:

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

如果需要 non-capturing 括号,请使用 (?:…) 而不是 (…)

如果因为要匹配更复杂的内容而必须捕获组,则可以使用 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 一样,除了它生成一个通过评估其 body 脚本获得的值列表,而 foreach 丢弃那些 body 脚本结果。)