1

次の数式があり、変数のii*3+(ii*2)+xdii+13-ii-ii-4すべての出現箇所を に置き換えたいと考えています。xdii は別の変数であるため、明らかに置き換えてはなりません。iiii[x]

問題は、結果の出力が次のようになることですii[x]*3+(ii[x]*2)+xdii+13-ii[x]-ii-4。したがって、私の問題は、正規表現エンジンが置き換えられるときに、-ii-iiそれらの2つの連続した一致の最初の出現のみが置き換えられることです。これが私の正規表現です。

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

数式でこれら 2 つの連続する文字の間に余分なスペースが 1 つある場合、結果は正しくなります。例:ii*3+(ii*2)+xdii+13-ii- ii-4正しい答えが得られます。

それが役立つ場合、エンジンが2回目の出現に達したときに正規表現デバッグ内部出力を追加しています-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

文字クラスに問題があります。ハイフンは最初または最後に表示する必要があります。そうしないと、範囲を示します。正直なところ、範囲に文字種 が含まれているとどうなるかわかりません\s

これを試して:

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