2016-03-30 12 views
4

コンテキスト置換の標準はありますか? VIに

aaajラインの

私はコマンドを実行します。

.S/* \ | J/X /グラム

行は

に変わります

XJ代わりに期待

XX

これはVIのバグですか? SED、gawkは、予想通り、たとえば、振る舞いのnawk:

また
% echo aaaj | awk '{gsub(/a*|j/,"x");print}' 
xx 

、私はコマンドに

.S/Jの\実行上の代わりに、コマンドの場合| */X/gに

( "j"と "a *"が交換されます)、その行は "xx"になります。

+0

Regexは異なるフレーバーを持っています。正規表現の実装方法については、viのドキュメントを参照してください。 –

+2

"ドキュメントを参照してください"は、stackoverflowのほとんどの質問に対する答えです。明らかに、私がドキュメンテーションで見つけることができれば、私は尋ねないだろう。 – user31264

+1

理論的には、DFAは 'a * \ | j'と' j \ | a * 'の両方で同じであるため、' a * 'と' j'の両方を置き換える必要があります。あなたの質問は良いです。私の答えは元の問題に答えないので、私はそれを削除しました。 – doptimusprime

答えて

3

"問題"は、の最初のブランチであるa*サブパターンが空の文字列と一致することができます。エンジンはaaaを見つけると

a*代替ブランチは3 a秒と一致し、substitutexでそれらのすべてを置き換えます。その後、エンジンはの位置に再び一致するように試みます。s + 1(source code commentsを参照)

a*は常に「勝ち」に一致し、jは決してマッチしないことに注意してください。これは優先順位のために起こり、最初のブランチは常にVim正規表現で勝ちます。 aaaj jjjの代わりにxjx xjxjxjになります。パターンが一致しない文字の前の各位置と一致するためです。

正しいパターンが

正規表現に置き換え、あなたは通常は、パターンに一致しない文字の間のすべての空の位置を一致させる必要はありません、したがって、論理的な解決策は+数量詞を使用することですa\+\|jパターン

関連する問題