Vimの正規表現マジックは、よく知られている正規表現クラスと互換性がありますか?


15

多くのUnixツールの正規表現構文は、多くの場合POSIXでコード化された基本および拡張正規表現(それぞれBREおよびERE)であり、一部の最新の実装では、Perlスタイル(PCREがこの実装です)。

Vimの魔法のレベルと、外部で定義されているがよく知られているクラスとの間に1対1の対応関係はありますか?POSIX にルック\mアラウンド\vが含まれていないことを除いて、BREおよびEREのように見えます。

そのような通信が存在する場合、どこかで定義されていますか?pattern.txtの言及は1つだけですPOSIX

または、Vimの正規表現を記述するために「マジック」に固執する必要がありますか?


3
AIFIKがVimに固有の単語境界も\v含まれていることは間違い<>ありません。いいえ、単に「Vim regex」と記述してください。(私は肯定的ではないため、回答として投稿しません)
Doorknob

@Doorknob、このコメントとしての回答の議論が面白いと思うかもしれません。コメントには3つの賛成票があり、それが間違っていると答えるコメントはないので、おそらく正しいでしょう(わかりません)。等 その精度を向上させることは不可能です。ポストされた答えとして、それはなど、精度向上のために編集upvoted、downvotedに対応することができ
ワイルドカード

回答:


21

要約すると、いいえ。Vimの正規表現は独自のフレーバーであり、他のフレーバーのように動作させるオプションはありません。

これは良いことだと思います。

マジック

この'magic'オプションは、Vimが使用する正規表現のフレーバーを変更しません。多くの\エスケープされた原子の動作を単純に反転させます。

たとえば、デフォルトで+は、リテラル+文字であり、\+「1つまたは複数の先行するアトム」を意味します。対照的に、*は「直前のアトムのゼロ個以上」を意味し、while \*はリテラル*です。多くの人がこれを非常に混乱させています。\vパターンで使用すると、パターンの一貫性が少し高くなります。:help 'magic'良い要約を与えます:

after:    \v       \m       \M       \V         matches ~
                'magic' 'nomagic'
          $        $        $        \$         matches end-of-line
          .        .        \.       \.         matches any character
          *        *        \*       \*         any number of the previous atom
          ()       \(\)     \(\)     \(\)       grouping into an atom
          |        \|       \|       \|         separating alternatives
          \a       \a       \a       \a         alphabetic character
          \\       \\       \\       \\         literal backslash
          \.       \.       .        .          literal dot
          \{       {        {        {          literal '{'
          a        a        a        a          literal 'a'

個人的には、デフォルトの動作はfoo(、リテラルを使用してのようなものを検索することは珍しくないコードファイルには適していると思います(

Vim独自の正規表現フレーバー

VimがPCREをサポートすることを望む多くの人々を目撃しました。個人的には、他のツールがVimの正規表現をサポートしていることを望みます。PCREで実現できない、または面倒な機能があります。

PCREでは不可能

ルックアラウンドは、一致しようとしているパターンの前または後にパターンが一致するかしないかをアサートできる一般的な機能です。たとえば、PCREパターンq(?!u)(またはVim regex pattern qu\@!qは、後に続かないに一致しuます。(これは、より正確であるq[^u]が存在することを必要とする、いくつかの後の文字がq。)

可変長の負の後読み

PCRE、および他の多くのフレーバーには、負の後読みパターンが固定長でなければならないという制限があります。つまり(?<![a-z]{3})foo、「正確に3つの小文字foo が先行しないストリング」を意味するのようなパターンは適切ですが、(?<![a-z]+)foo(「任意の数の小文字fooが先行しないストリング」を意味する)はそうではありません。

この制限はVimには存在しません。Vimでは、のようなパターン\([a-z]\+\)\@<!fooは少し見苦しいかもしれませんが、完全に有効です。

Vim正規表現で簡単に

いくつかのことは、Vimの正規表現の味の方がはるかに優れています。

マッチのアンカーの開始と終了

私の意見では、最も注目すべきは\zs\zeアンカーです。これらにより、一致の開始と終了を指定できます。たとえばfoo(\zs.*\ze)(など)の関数呼び出しでとの間にあるもののみに一致しfoo(...)ます。これはPCREで実行できますが、lookaroundを使用する必要があり、少し面倒です。(?<=foo\().*(?=\))

プレフィックス一致

Vimができるもう1つのクールなことは、特定の文字シーケンスの任意のプレフィックス(空のプレフィックスを含む)に一致することです。たとえば、、、、またはに一致するffofoofoodパターンf\%[ood]を使用できます。PCREでは、このようなパターンは次のようになりf(o(od?)?)?ます。(長い文字列を想像してみてください!)

カーソル、行、列の位置を一致させる

Vimの正規表現には、バッファー内の位置を一致させるためのアンカーがあります。


Vimの正規表現のフレーバーを採用することは価値があると思います。主にプログラミングに使用されるテキストエディタでの使用に適し、非常に強力です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.