0

我想匹配如下所示的模式,它是一个环境变量,后跟一个目录名称。我想完全匹配这两个词。如果匹配,则返回 1。

$::env(WORK)/bill/

如何在 TCL 中使用regexp做到这一点?
我是新手,所以任何帮助表示赞赏。谢谢。

我已经尝试过了,它可以工作:

if {![file isdirectory "${::env(WORK)}/bill/"]} {} else { return 1} 

使用 RE: regexp {^(bill)$} 作为第二个单词。第一个词,因为它是环境变量,所以我被困在那里

4

1 回答 1

1

让我们看看我是否理解你的问题。你有一个 Tcl 字符串并且你想匹配一个模式$::env(something)/somethingelse/来识别somethingsomethingelse部分。

如果是这样,那么您想使用类似

set str {$::env(WORK)/bill/}
if {[regexp {\$::env\((.+)\)/(.+)/} $string -> envName dirName]} {
    puts $envName
    puts $dirName
}

你应该有

WORK
bill

打印在您的终端上。

regexp命令中,模式被包含在其中{}以避免 Tcl 替换。它以转义的美元开头,\$因为美元将匹配行尾。然后是文字::env。然后转义括号\(...\)以匹配数组语法。在它们中,我们有一个捕获原子(.+),用于匹配任何重复一次或多次的字符,并带有报告。然后跟随文字斜线/.../和第二个捕获原子(.+)以匹配目录部分。

->是一个变量的名称,它将包含与模式匹配的所有内容($str您可以通过使用 打印它来查看它puts ${->}),但在这种情况下不需要它,因此我们使用奇怪的名称。

然后是两个 var 名称,envNamedirName,它们将分别报告第一个和第二个原子的匹配(.+)(不包括括号)。

编辑对于非贪婪匹配,正如 Donal Fellows 所指出的,您可以使用(.+?)而不是(.+),我同意这将是一个不错的添加。

我希望这能满足您的需求。

于 2013-02-24T09:56:37.163 回答