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"になります。
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"になります。
"問題"は、の最初のブランチであるa*
サブパターンが空の文字列と一致することができます。エンジンはaaa
を見つけると
、a*
代替ブランチは3 a
秒と一致し、substitute
はx
でそれらのすべてを置き換えます。その後、エンジンはの位置に再び一致するように試みます。s + 1(source code commentsを参照)
a*
は常に「勝ち」に一致し、j
は決してマッチしないことに注意してください。これは優先順位のために起こり、最初のブランチは常にVim正規表現で勝ちます。 aaaj jjj
の代わりにxjx xjxjxj
になります。パターンが一致しない文字の前の各位置と一致するためです。
正しいパターンが
正規表現に置き換え、あなたは通常は、パターンに一致しない文字の間のすべての空の位置を一致させる必要はありません、したがって、論理的な解決策は+
数量詞を使用することです、a\+\|j
パターン。
Regexは異なるフレーバーを持っています。正規表現の実装方法については、viのドキュメントを参照してください。 –
"ドキュメントを参照してください"は、stackoverflowのほとんどの質問に対する答えです。明らかに、私がドキュメンテーションで見つけることができれば、私は尋ねないだろう。 – user31264
理論的には、DFAは 'a * \ | j'と' j \ | a * 'の両方で同じであるため、' a * 'と' j'の両方を置き換える必要があります。あなたの質問は良いです。私の答えは元の問題に答えないので、私はそれを削除しました。 – doptimusprime