让我们看看我是否理解你的问题。你有一个 Tcl 字符串并且你想匹配一个模式$::env(something)/somethingelse/
来识别something
和somethingelse
部分。
如果是这样,那么您想使用类似
set str {$::env(WORK)/bill/}
if {[regexp {\$::env\((.+)\)/(.+)/} $string -> envName dirName]} {
puts $envName
puts $dirName
}
你应该有
WORK
bill
打印在您的终端上。
在regexp
命令中,模式被包含在其中{}
以避免 Tcl 替换。它以转义的美元开头,\$
因为美元将匹配行尾。然后是文字::env
。然后转义括号\(...\)
以匹配数组语法。在它们中,我们有一个捕获原子(.+)
,用于匹配任何重复一次或多次的字符,并带有报告。然后跟随文字斜线/.../
和第二个捕获原子(.+)
以匹配目录部分。
->
是一个变量的名称,它将包含与模式匹配的所有内容($str
您可以通过使用 打印它来查看它puts ${->}
),但在这种情况下不需要它,因此我们使用奇怪的名称。
然后是两个 var 名称,envName
和dirName
,它们将分别报告第一个和第二个原子的匹配(.+)
(不包括括号)。
编辑对于非贪婪匹配,正如 Donal Fellows 所指出的,您可以使用(.+?)
而不是(.+)
,我同意这将是一个不错的添加。
我希望这能满足您的需求。