2013-02-23 64 views
0

我想要匹配如下所示的模式,它是一個環境變量,後跟一個目錄名稱。我想要完全匹配它的話。如果匹配返回1在Tcl上需要幫助RegExp

$::env(WORK)/bill/ 

怎麼能在這個使用TCL正則表達式做些什麼呢?
我是新手,所以任何幫助表示讚賞。 謝謝。

我與這個嘗試過了,它的工作原理:

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

隨着RE: 正則表達式{^(票據)$}第二個字。第一個詞,因爲它是環境變量我卡在那裏

+0

我試過這個,它的工作原理:if {![file isdirectory「$ {:: env(WORK)}/bill /」]} {} else { return 1}但是我想試試它regexp – arkanoid 2013-02-23 21:46:14

+0

正則表達式{^(bill)$}爲第二個單詞。第一個詞,因爲它是環境變量我卡在那裏 – arkanoid 2013-02-23 22:01:30

+1

既然你已經有一些工作,是否有一個原因,你需要正則表達式? – 2013-02-24 05:40:58

回答

1

讓我們看看我是否理解你的問題。你有一個Tcl字符串,你想匹配$::env(something)/somethingelse/的模式,識別somethingsomethingelse部分。

如果是這樣,那麼你要使用somethink像

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

,你應該有

WORK 
bill 

打印你的終端上。

regexp命令中,該模式包含在{}中以避免Tcl替換。它從一個逃脫的美元\$開始,因爲美元會匹配一行的結尾。接下來是文字::env。然後轉義圓括號\(...\)以匹配數組語法。選取它們,我們有一個捕獲原子(.+)用於將任何重複一次或多次的字符與報告進行匹配。然後用第二個捕獲原子/.../跟隨文字斜槓(.+)匹配目錄部分。

->是將包含在$str與模式匹配一​​切變量的名稱(您可以通過puts ${->}打印出來看的話),但它不是在這種情況下需要的,所以我們用陌生的名字。

然後兩個var名稱如下,envNamedirName,它們將分別報告第一個和第二個原子的匹配(括號不包括在內)。

編輯對於非貪婪匹配,如多納爾研究員指出,可以用(.+?)代替(.+),我同意這將是一個很好的補充。

我希望這可以滿足您的需求。

+0

它可能應該使用非貪婪RE或合適的否定集合(以便您不會對輸入字符串中存在正確匹配點的情況感到驚訝)。否則,這看起來像一個非常合理的方法。 – 2013-02-24 13:23:27

+0

你說得對。我用'(。+?)'原子添加了一點編輯。 – 2013-02-24 16:11:49

+0

非常感謝! Marco Pallante – arkanoid 2013-02-25 21:31:28