>我有如下简单的字符串:
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
丢弃这些主体脚本结果。