2012-09-22 111 views
1

我有以下數學表達式ii*3+(ii*2)+xdii+13-ii-ii-4,我想用ii[x]替換變量ii的每個出現次數。顯然xdii不能被替換,因爲它是另一個變量。正則表達式連續匹配

問題是產生的輸出是:ii[x]*3+(ii[x]*2)+xdii+13-ii[x]-ii-4。所以我的問題是,當正則表達式引擎替換-ii-ii時,它只會取代這兩個連續匹配的第一次出現。這裏是我的正則表達式,

's/([\+\*\-\s\(]|^)ii([\+\*\-\s\)])/$1ii[x]$2/' 

如果數學表達式有這兩個consecutives之間的一個額外的空間,那麼竟被結果是正確的。例如:ii*3+(ii*2)+xdii+13-ii- ii-4會產生正確的答案。

萬一它有助於當發動機達到提前-ii-ii

Guessing start of match, REx `([\+\*\-\s\(]|^)ii([\+\*\-\s\)])' against `ii-4'... 
Found floating substr `ii' at offset 0... 
Guessed: match at offset 0 
Matching REx `([\+\*\-\s\(]|^)ii([\+\*\-\s\)])' against `ii-4' 
    Setting an EVAL scope, savestack=0 
    23 <i+13-ii-> <ii-4> | 1: OPEN1 
    23 <i+13-ii-> <ii-4> | 3: BRANCH 
    Setting an EVAL scope, savestack=7 
    23 <i+13-ii-> <ii-4> | 4: ANYOF[\11-\15 (*+\-] 
           failed... 
    23 <i+13-ii-> <ii-4> | 15: BOL 
           failed... 
    Clearing an EVAL scope, savestack=0..7 
Match failed 

由於第二occurence我正在追加正則表達式調試內部輸出,

回答

1

null width matches。通常:

The symbols \< and \> respectively match the empty string at the beginning 
and end of a word. The symbol \b matches the empty string at the edge 
of a word, and \B matches the empty string provided it's not 
at the edge of a word. The symbol \w is a synonym for [_[:alnum:]] and \W is a 
synonym for [^_[:alnum:]]. 

所以在你的情況下\<ii\>將是正確的事情,以取代 但隨着匹配的文檔您使用的檢查。

+0

基於你的答案我修改了我的正則表達式爲 –

+0

's /([\ + \ * \ - \ s \(] |^| \ b)ii([ \ + \ * \ - \ s \)] | \ b)/ $ 1ii [x] $ 2 /'並且完美地工作 –

+0

@FranciscoJuretig其實我不明白爲什麼你需要這樣一個複雜的表達式。大多數'替換工具'(perl操作符,或者PHP lib調用,或者其他)都可以一次性進行多次替換。當你開始你的字符串沒有發生與下標的ii。我對麼? – Serge

0

有你的性格類問題:連字符必須先出現或最後出現,否則將表示範圍。雖然說實話我不知道如果範圍包含一個字符類型\s會發生什麼。

試試這個:

s/([+*\s(-]|^)ii([+*\s)-])/$1ii[x]$2/ 
+0

你的評論是絕對正確的,並完全同意你的看法。儘管如此,這個問題還沒有解決。我需要添加一個| \ b爲了解決問題 –