1

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

提前致谢,

4

2 回答 2

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\>将是正确的替换但是检查你正在使用的匹配器文档。

于 2012-09-22T18:45:51.510 回答
0

您的字符类中有一个问题:连字符必须出现在第一个或最后一个,否则它将表示一个range。虽然老实说,我不知道如果范围包含字符类型 \s会发生什么。

试试这个:

s/([+*\s(-]|^)ii([+*\s)-])/$1ii[x]$2/
于 2012-09-22T18:42:57.167 回答