web-dev-qa-db-ja.com

Linuxのポケットベル(またはvim)での否定的な後読み/アサーション

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

14
Gregg Leventhal

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"
22
cuonglm

_(?!\.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
_

ただし、デフォルトでは、lessはREG_EXTENDEDでPOSIX regcompを使用するため、システムの拡張正規表現を取得するため、通常、_grep -E_と同じようなものになります。

GNU拡張正規表現では、同等の先読み演算子または先読み演算子はありません。

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

_index($|[^.]|\.($|([^p]|p($|([^h]|h($|[^p]))))))
_

lessを使用すると、_&_キーを使用して、_index.php_(_&!index\.php_)を含む行を除外し、index(_/index_)。 (_index.php_も含む行に表示されるindexの他のインスタンスを見逃してしまいます).

7