正则表达式连续匹配

时间:2012-09-22 18:35:50

标签: regex expression

我有以下数学表达式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

提前致谢,

2 个答案:

答案 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/