2016-10-03 70 views
1

我想對路徑名執行一些正則表達式並保留它。tcl中的壓縮文件的正則表達式

我行測試是這樣的:

"/home/tclshell/test.tcl.gz" "/home/tclshell/test1.tcl" /home/tclshell/test.tcl

所以triied之類的東西: regexp {(\S+\.tcl(?:\.gz)?)} $line blank mypathregexp {(\S+\.tcl(|\.gz))} $line blank mypath

但它不似乎工作,"似乎是保存在$mypath。 正則表達式有什麼問題?

+0

你有什麼期望的輸出? –

+0

如果在開始處有一個可選的''',那麼添加它 - '「?(\ S + \。tcl(?:\。gz)?)' –

+0

我的預期輸出是'/home/tclshell/test.tcl。 gz'爲第一行,例如 – heyhey

回答

1

關鍵是\S匹配任何字符,但空格,所以它也匹配"

您可以在模式的開始添加一個可選的"但ouside的捕獲組 - "?(\S+\.tcl(?:\.gz)?)

set line "\"/home/tclshell/test.tcl.gz\"" 
regexp {"?(\S+\.tcl(?:\.gz)?)} $line blank mypath 
puts $mypath 

Tcl online demo

另一種方式是通過替換它排除\S"具有反轉速記類的否定字符類用於空白(\s)並將"添加到其中:[^\s"]

([^\s"]+\.tcl(?:\.gz)?) 

regex demo

+0

明白,謝謝你的回答 – heyhey

+0

請注意,這個正則表達式(就像OP使用的正則表達式)會匹配很多可能不需要的東西,比如'?#&= @ .tcl.foo'。 –

+0

當然,它會像'[^ \ s「] +'匹配除空格和雙引號以外的1+個字符,但這似乎不相關。 –