2

次のパターンを gvim で検索しようとしています。

arrayA[*].entryx

以下に一致することを願っています:

arrayA[size].entryx  
arrayA[i].entryx
arrayA[index].entryx

ただし、上記の行がファイルに存在する場合でも、パターンが見つからないというメッセージが出力されます。

arrayA[.].entryx  

arrayA[i].entryx のみに一致します。つまり、[] 中かっこの間に 1 文字のみが含まれます。

[] 中かっこの間で複数の文字を一致させるにはどうすればよいですか?

4

3 に答える 3

2

ここに PCRE 式の詳細があります

/arrayA\[[^]]*]\.entryx/
         ^^^^^            # 0 or more characters before a ']'
       ^^      ^^         # Escaped '[' & '.'
              ^           # Closing ']' -- does not need to be escaped
 ^^^^^^          ^^^^^^   # Literal parts

どこを探したい場合arrayA[X].entryxは、 に少なくとも 1 個の文字があり[]
に置き換える必要があり \[[^]]*ます\[[^]]\+

ps:私の編集に注意してください-私は\*ちょうどに変更しました*-あなたもそれをエスケープしません。
ただし、エスケープする必要があります+ :-)


Updateあなたのコメントについて:私のコメントは広く
エスケープすることに関するあなたの質問に答えますが、 詳細についてはPerl Character Class details を参照してください。 具体的には、セクション。文字が文字クラス (CCL) を開始する と、何をエスケープする必要があるかの規則が変わります。]

Special Characters Inside a Bracketed Character Class
[

于 2012-05-21T16:25:00.320 に答える
1

は前の*文字を繰り返します。[文字クラスを開始します。したがって、次のようなものが必要です。

/arrayA\[[^]]*]\.entryx/

これは、リテラル、リテラル、リテラル、および[以外の一連の 0 個以上の文字を検索します。]].entryx

于 2012-05-21T16:06:39.790 に答える
0

VIMでは、、、、、など[の一部の特殊文字をエスケープする必要があることを常に覚えておいてください。が前の文字を繰り返す前に述べたように、これで単純に を使用できますが、貪欲な文字です。奇妙なものと一致する可能性があります。ファイルに次の行を追加すると、理解できます。]{}.*/arrayA\[.*\]\.entryx*arrayA[size].entryx = arrayB[].entryx

「より安全な」正規表現は次のようになります。

/arrayA\[.\{-\}\]\.entryx

.\{-\}貪欲でない方法で任意の文字に一致します。場合によっては witch の方が安全です。

于 2012-05-21T16:29:38.653 に答える