Linuxレスポケベル(またはvim)でのネガティブな後読み/先読みのアサーション


14

を使用して、ログで.phpが後に続かない「インデックス」のすべてのインスタンスを検索したいless/index(?!\.php)動作しません。これは可能ですか?lessとvimの正規表現は何ですか(違いますか?)。これらのアプリケーションのそれぞれの正規表現ライブラリではこれは不可能ですか?


回答:


22

ではvim、次のようにできます。

/index\(\.php\)\@!

詳細については、コマンドモードで次を試してください:h \@

\@!     Matches with zero width if the preceding atom does NOT match at the
        current position. /zero-width {not in Vi}
        Like '(?!pattern)" in Perl.
        Example                 matches
        foo\(bar\)\@!           any "foo" not followed by "bar"
        a.\{-}p\@!              "a", "ap", "aap", "app", etc. not immediately
                                followed by a "p"
        if \(\(then\)\@!.\)*$   "if " not followed by "then"

綺麗な!少ないアイデアはありますか?これはあまり機能しません。私は正規表現の振る舞いがどこでもPCREだったことを望んでいますが、残念ながらそうではありません。
グレッグレベンタール

7
また、シンタックスに注意negativの後読み\@<!
lanoxx

それはあなたが負の外観を置く必要があると言って行くの後ろにパターンの前に。例:and と\(some\)\@<!thing一致しますがthingeverythingnothingは一致しませんsomething
ドワンダーソン

7

(?!\.php)perlの正規表現演算子です。less通常、システムのPOSIX正規表現APIを使用するため、通常、GNUシステム上のGNU拡張正規表現vimvim正規表現を使用します。

vim既にcuonglmによって示されるように、相当にindex(?!\.php)なりindex\(\.php\)\@!、または\vindex(\.php)@!

lessコンパイル時に、あなたが使用する正規表現型の正規表現ライブラリ/ API、結果としてを選択することができます:

    --with-regex={auto,gnu,pcre,posix,regcmp,re_comp,
                    regcomp,regcomp-local,none}
        Select a regular expression library  auto

ただし、デフォルトでは、lessPOSIX regcompでREG_EXTENDED が使用されるため、システムの拡張正規表現が取得されるため、通常はのようなものになりgrep -Eます。

GNU拡張正規表現では、同等のルックビハインドまたはルックアヘッド演算子はありません。

あなたは難しい方法でそれをすることができます:

index($|[^.]|\.($|([^p]|p($|([^h]|h($|[^p]))))))

ではless、あなたはおそらく使用することができ&含む行をフィルタリングするためのキーをindex.php&!index\.php)、次にを検索index/index)。(以下をindex含む行に表示される他のインスタンスを見逃すことになりますindex.php)。


1
less使用する正規表現ライブラリはコンパイル時間に依存すると思います。
cuonglm

@Gnouc、あなたは正しい、それは今でもPCREをサポートしているようです。
ステファンシャゼル

ええ、の出力を解析することでをless使用PCREするかどうかを確認できldd $(which less)ます。しかし、他のライブラリでは、チェックする方法を知っていますか?
クオングルム

1
@Gnouc、で正規表現ライブラリの名前を出力しless --versionます。
ステファンシャゼル

私はUbuntu 12.04 LTSを使用しless --verion、でless 444、著作権と一緒にのみ印刷します。
クオングルム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.