我想匹配如下所示的模式,它是一个环境变量,后跟一个目录名。我想把它们完全匹配。如果匹配则返回1。
$::env(WORK)/bill/
如何使用 regexp 在TCL中完成此操作?
我是新手所以任何帮助表示赞赏。
感谢。
我已尝试过这个并且有效:
if {![file isdirectory "${::env(WORK)}/bill/"]} {} else { return 1}
有RE: regexp {^(bill)$}代表第二个单词。第一个字,因为它是环境变量我被困在那里
答案 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名称envName
和dirName
,它们将分别报告第一个和第二个原子(.+)
的匹配(排除括号)。
编辑对于非贪婪匹配,如Donal Fellows所指出,您可以使用(.+?)
代替(.+)
,我同意这是一个不错的补充。
我希望这能满足您的需求。