2012-01-03 25 views

回答

0

好吧,我想我終於成功地解析問題。

第一個問題是「sub」是「sub1」的子字符串,它們都是「sub1_ex」的子字符串。

的第二個問題是,在正則表達式引擎的術語「字」是匹配類\w其中既包括字母數字和下劃線(參見this)相鄰字符的contigous塊,因此如果使用\m\M錨定模式「sub1」,字符串「sub1_ex」不匹配,因爲「1」和「_」之間沒有字邊界。

接下來要做什麼確實取決於你的使用情況,不幸的是我不太明白。將var2更改爲sub\M可能會解決它,但我不確定這是您想要的。

0

你得到的問題是,單詞字符類包含下劃線字符,所以特殊的「在字的開始/結束」模式不適合你。

一個部分解決方案是使用一種更精細的匹配:

regexp "\\m${var1}(?!\[a-zA-Z0-9\])" $var3 

此作品在詞的結尾,而不是在開始(Tcl中使用的RE引擎不支持任何形式的的後視限制)。因此,它實際上是簡單的改造對字符串相匹配:

regexp "\\m$var1\\M" [string map {"_" " "} $var3] 

這將正常工作提供你想找到不包括下劃線的字符串。我想你的情況確實如此。如果沒有,你必須使用一個真正伎倆,並插入一些真是難得字符作爲替代:

set mapping {"_" "\ufffd"}; # Unicode replacement char! 
regexp "\\m[string map $mapping $var1]\\M" [string map $mapping $var3] 
+0

另外要注意,在字符串中RE元字符正在搜索會出現問題。 – 2012-01-03 10:12:58

相關問題