我有以下數學表達式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我正在追加正則表達式調試內部輸出,
基於你的答案我修改了我的正則表達式爲 –
's /([\ + \ * \ - \ s \(] |^| \ b)ii([ \ + \ * \ - \ s \)] | \ b)/ $ 1ii [x] $ 2 /'並且完美地工作 –
@FranciscoJuretig其實我不明白爲什麼你需要這樣一個複雜的表達式。大多數'替換工具'(perl操作符,或者PHP lib調用,或者其他)都可以一次性進行多次替換。當你開始你的字符串沒有發生與下標的ii。我對麼? – Serge