6

vim を使用して検索を行い、次のコマンドで置き換えています。

%s/lambda\s*{\([\n\s\S]\)*//gc

.の後のすべての単語、行末、および空白文字を一致させようとしてい{ます。たとえば、次の行全体が一致する必要があります。

    lambda {
  FactoryGirl.create ...

代わりに、改行までのみ一致し、前にスペースはありませんFactoryGirl。代わりにタブ文字があったがサイコロがない場合に備えて、以前にすべてのスペースを手動で置き換えようとしました。これが機能しない理由を誰か説明できますか?

4

2 に答える 2

16

\s空白のアトムです。\n、見た目は似ていますが、構文的には改行文字のエスケープシーケンスです。コレクションアトム内には[...]、他のアトムを含めることはできません。文字のみを含めることができます(。From :のような特別なものを含む) \n:help /[]

  • 'l'フラグが'cpoptions'{Viにない}に含まれていない場合、次の翻訳が受け入れられます。
\e  <Esc>
\t  <Tab>
\r  <CR>    (NOT end-of-line!)
\b  <BS>
\n  line break, see above |/[\n]|
\d123   decimal number of character
\o40    octal number of character up to 0377
\x20    hexadecimal number of character up to 0xff
\u20AC  hex. number of multibyte character up to 0xffff
\U1234  hex. number of multibyte character up to 0xffffffff

注:上記の他のバックスラッシュコードは[]内では機能しません!

したがって、空白文字を文字通り指定するか[ \t\n...]、対応する文字クラス式を使用する[[:space:]...]か、論理和またはを介してアトムをコレクションと結合し\%(\s\|[...]\)ます。

于 2012-09-05T07:30:00.533 に答える
1

[ ... ]Vim は、文字クラス内の文字を異なる方法で解釈します。lambda {sssその正規表現はorに完全には一致しないため、文字通りではありませんlambda {\\\。と は何\s\S解釈されるのか... まだ説明できません。

しかし、私は私が望んでいたことをほぼ達成することができました:

%s/lambda\s*{\([\n a-zA-z]\)*//gc

それは私が望んでいた句読点を無視します。これは機能しますが、危険です:

%s/lambda\s*{\([\n a-zA-z]\|.\)*//gc

最後の文字 like の後に文字を追加すると、}グロビング中に vim がハングするためです。したがって、私の解決策は、必要な句読点を文字クラスに追加することでした。

于 2012-09-04T20:55:11.557 に答える