我有以下数学表达式ii*3+(ii*2)+xdii+13-ii-ii-4
,我想替换ii
的变量ii[x]
的每个出现。显然xdii不会被替换,因为它是另一个变量。
问题是结果输出是:ii[x]*3+(ii[x]*2)+xdii+13-ii[x]-ii-4
。所以我的问题是,当正则表达式引擎替换-ii-ii
时,它只替换了这两个连续匹配的第一次出现。这是我的正则表达式,
's/([\+\*\-\s\(]|^)ii([\+\*\-\s\)])/$1ii[x]$2/'
如果数学表达式在这两个连续符之间有一个额外的空格,那么结果就是正确的。例如: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
提前致谢,
答案 0 :(得分: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\>
将是正确的替代品
但请查看您正在使用的匹配器的文档。
答案 1 :(得分:0)
您的角色类中存在问题:连字符必须首先出现或最后出现,否则它将表示范围。虽然说实话我不知道如果范围包含 type \s
字符会发生什么。
试试这个:
s/([+*\s(-]|^)ii([+*\s)-])/$1ii[x]$2/