3

次のような行を変更するための正規表現を手伝ってもらえますか

<string name="Final time">Final time</string>
<string name="After extra time">After extra time</string>

行に

<string name="final_time">Final time</string>
<string name="after_extra_time">After extra time</string>

したがって、二重引用符の間はスペースをアンダースコアに置き換え、すべての文字を小文字にします。

この正規表現を VIM の検索/置換で使用します。

4

2 に答える 2

5

一般的なアプローチ:

:%s/\(<string name="\)\(\u\)\([^" ]\+\) \([^" ]\+\)/\1\l\2\e\3_\4/

これは、すべての文字列@nameを置き換えます

  • 大文字(\u)で始まり、
  • スペースで区切られた2つの単語(\([^" ]\+\) \([^" ]\+\))と
  • 対応する小文字(\l\2\e)に置き換えます。
  • また、スペースをアンダースコアに置き換えます。

@nameのすべてを小文字にするために、これを単純化することができます。

:%s/\(<string name="\)\([^" ]\+\) \([^" ]\+\)/\1\l\2_\3_\e/

複数のスペースを取り除くには、2つの手順を実行します。まず、属性値を小文字にします。

:%s/\(<string name="\)\([^"]\+\)/\1\l\2\e/

次に、属性値のすべてのスペースをアンダースコアに置き換えます

:%s/\(<string name="[^"]*\)\@<= /_/g

\@<=これは、vimが前向きな後読みアサーションを表現する方法であることに注意してください。

于 2012-04-29T11:14:49.233 に答える
1

(この回答は時代遅れであり、現在尋ねられている質問に完全には回答していません。ただし、別の回答者のアドバイスで削除されるのではなく、ここに保持されます。)

だまされない正規表現が必要な場合は、それにはいくらかの作業が必要です。ただし、Vim を使用している間は、通常、よりリラックスした態度を取ります。これは役に立ちませんか?

:s/"final time"/"final_time"/g

g置換を 1 回だけ行いたい場合は、末尾を省略できます。一方、あなたはそれを作ることができます

:s/"\cfinal time"/"final_time"/g

パターンマッチで大文字と小文字を区別しないようにします (ただし、これを正しく行うには、@Tomalak の回答を参照してください)。

ただし、Vim を使用している場合は、次のような簡単な方法がある場合があります。

  1. を押しqqて、マクロの記録を開始しますq(または、必要に応じてqaマクロaの記録を開始します。不明な場合は、qq入力するのが最も速く、他の方法と同様に優れています)。
  2. 検索コマンド/"\cfinal time"を入力して、Enter キーを押します。
  3. f<Space>またはを押し6lてカーソルをスペースに移動します。
  4. を押しr_て、スペースをアンダースコアに置き換えます。
  5. を押しqて、マクロの記録を終了します。

次に、必要に応じて、すぐに を押し@qて、Vim に同じ操作を自動的に繰り返させることができます。"final time"ファイル全体に複数の文字列が散らばっており、すべて同じ編集が必要な場合、これは迅速で便利です。さらに良いことに、Vim に同じ操作を実行させたい3 回目@@以降は、 を押すだけで最後の@操作を繰り返すことができます。これは非常に高速です。

/"\cfinal time"(検索を大文字と小文字を区別しないように変更することを追加してくれた @Tomalak に感謝します。私はそれを知りませんでした。)

于 2012-04-29T11:10:11.933 に答える