如何从 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_ " 带有尾随空白,但它在功能上仍然等同于这两个标记的列表。)
这是另一种技术,使用字符串命令:
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_
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_ " 带有尾随空白,但它在功能上仍然等同于这两个标记的列表。)
这是另一种技术,使用字符串命令:
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_