如何从 TCL 中的字符串生成重复模式列表?

How to generate a list of repeating patterns from a string in TCL?

set s1 "dir1/dir2/some_word_g3_ger_another_word_g1_ger_TEMP2"

如何从 s1 获取此列表 {some_word_g3_ger_ another_word_g1_ger_}?

我试过了:

regexp -inline -all {[^/]+_ger_} $s1

但是拆分失败:

some_word_g3_ger_another_word_g1_ger_

您需要使匹配成为非贪婪匹配,即确保一旦找到最小匹配就结束,不是 当它匹配尽可能多的文本时。这是通过使用 +? 量词(对应于贪婪的 + 量词)完成的:在这种情况下,非捕获组 ((?:...)) 也是必需的。

% regexp -inline -all {(?:[^/]+_ger_)+?} $s1
some_word_g3_ger_ another_word_g1_ger_

预计到达时间:

正则表达式在这里很有用,因为它可以处理跳过不需要的文本 分割标记。如果在第一步中删除不需要的文本是可行的,那么其他几种方法至少也同样有用。例如:

set s1 some_word_g3_ger_another_word_g1_ger_
string map {_ger_ {_ger_ }} $s1

(这导致字符串 "some_word_g3_ger_ another_word_g1_ger_ " 带有尾随空白,但它在功能上仍然等同于这两个标记的列表。)

文档: regexp, Syntax of Tcl regular expressions

这是另一种技术,使用字符串命令:

set base [file tail $s1]
set start 0
while {1} { 
    set idx [string first _ger_ $base $start]
    if {$idx == -1} break
    lappend bits [string range $base $start $idx+4]
    set start [expr {$idx + 5}]
}
set bits
# => some_word_g3_ger_ another_word_g1_ger_