需要有关Tcl RegExp的帮助

时间:2013-02-23 21:18:23

标签: regex tcl

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

$::env(WORK)/bill/

如何使用 regexp 在TCL中完成此操作?
我是新手所以任何帮助表示赞赏。 感谢。

我已尝试过这个并且有效:

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

有RE: regexp {^(bill)$}代表第二个单词。第一个字,因为它是环境变量我被困在那里

1 个答案:

答案 0 :(得分:1)

让我们看看我是否理解你的问题。您有一个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名称envNamedirName,它们将分别报告第一个和第二个原子(.+)的匹配(排除括号)。

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

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