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 脚本结果。)
我有如下简单的字符串:
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 脚本结果。)