3

単語のグループの順列を含む行を検索しようとしています(大文字と小文字を区別しない)。たとえば、単語fooとに興味がある場合barは、次の最初の4行は一致させますが、最後の4行は一致させませんfile

Foo and bar.
Bar and foo.
The foo and the bar.
The bar and the foo.
Foobar.
Barfoo.
The foobar.
The barfoo.

この投稿を見て、私はこのようなものを次のように構築できることに気付きましたperl

perl -n -e 'print if (/\bfoo\b.*?\bbar\b/i || /\bbar\b.*?\bfoo\b/i)' file

これは最初の4行だけに正しく一致します。または、この投稿で提案されている先読み構造を使用して、もう少し簡潔なコードで照合を行うことができます。

perl -n -e 'print if (/(?=.*\bfoo\b)(?=.*\bbar\b)/i)' file

ただし、これらを正規表現構文で記述する方法を理解することはできません。正規表現構文vimよりもはるかにビザンチンであることがわかりperlます。vim検索関数(/または)を使用してさまざまな式を試しまし?たが、どれも一致しませんでした。、uses 、およびで(?=string)使用される構文の代わりに、私は気づきました。perlvim\(string\)\@=string\&

ただし、さまざまな試みがあります。例:

  • \c\(foo\)\@=\(bar\)@=
  • \c\(foo\)\@=\.*\(bar\)@=
  • \cfoo\&bar\&

\c大文字と小文字を区別しない一致に使用される場合)はすべて失敗しました。

誰かが正しいvim構文を示してもらえますか?

4

2 に答える 2

5

試してみてください:\c.*\<foo\>.*\&.*\<bar\>.*。これは、最初の4行のそれぞれの全体と一致する必要があります。

あなたはに最も近かったが、例えば、一致さ\c\(foo\)\@=\(bar\)@=せたくないので、単語一致の開始/終了を使用する必要がある:。foobarbarfoo\<\>

を使用\&すると、パターンが少し単純化されます。

そのパターンの行全体を一致させる必要がなく、一致する行をヒットするだけの場合.*は、パターンの末尾の部分を削除することで、この正規表現をもう少し単純化できます。\c.*\<foo\>\&.*\<bar\>

于 2012-08-07T17:45:53.570 に答える
2

次のことを試してください。

/^\c\(.*\<foo\>\)\@=\(.*\<bar\>\)\@=/

これはPerlの先読みバージョンと同じで\@=、前の要素またはグループを前向きな先読みにします。 \<\>は、と同等のvim\bであり、大文字と\c小文字を区別しないマッチングを可能にします。^各行に1回だけ一致するようにアンカーを追加しました。

于 2012-08-07T17:46:07.657 に答える