web-dev-qa-db-ja.com

Textmate:大文字と小文字を区別する一致を置き換える正規表現?

この文の最初の文字の大文字と小文字を区別せずに、単一の検索/置換を使用してすべての単語townvillageに置き換えるにはどうすればよいですか。

Towns are small cities. I live in a town.

enter image description here

5
cwd

\b(?:(T)|t)own(s?)\b(?1:\u)village$2

(ダイアログで大文字と小文字を区別しないのチェックを外します)

  • \b =単語の境界
  • (?:) =非キャプチャグループ
  • (?1:\u) =キャプチャされたグループ1の場合、次の文字を大文字に変換します
9
Lri

私は今仕事用のマシンを使用しているので、ここでテストするTextMateはありませんが、これあなたが望むことをするかもしれません:

Find:     \b(T)?((?<!T)t)?(?<! )own(s)?\b
Replace:  (?1:Village)(?2:village)$3

(最初に「ケースを無視」のチェックを外してください。)

説明:

'Find'パターンは、ownまたはTが前に付いた文字tを検索し、それらをそれぞれ$1および$2にキャプチャします。 。 2番目のキャプチャ内の(?<!T)は、おそらくそうなる可能性は低いですが、両方を同時に取得しないようにします(Ttを一緒にするなど)。また、(?<! )ビットは、ownの前にスペースを付けることができないことを意味します—これにより、Word ownとそれ自体が一致するのを防ぐことができます。どちらかの側の\bは、Word全体にのみ一致する必要があることを意味します(そうでない場合は、townieschownなどに一致します)。最後に、(s)?部分は最後のs(存在する場合)を$3にキャプチャします。

置換パターンは、 条件付き挿入 を使用して、テキストを何に置換するかを決定します。擬似コードでは、置換文字列は基本的に次のようになります。

if (the first capture [T] exists)  { replace the text by the Word Village }
if (the second capture [t] exists) { replace the text by the Word village }

(次に、$3を追加します。これは、空であるか、sを含みます)

醜いですが、とにかくあなたが与えた例ではおそらくうまくいくと思います。

2
kine