この文の最初の文字の大文字と小文字を区別せずに、単一の検索/置換を使用してすべての単語town
をvillage
に置き換えるにはどうすればよいですか。
Towns are small cities. I live in a town.
\b(?:(T)|t)own(s?)\b
→(?1:\u)village$2
(ダイアログで大文字と小文字を区別しないのチェックを外します)
\b
=単語の境界(?:)
=非キャプチャグループ(?1:\u)
=キャプチャされたグループ1の場合、次の文字を大文字に変換します私は今仕事用のマシンを使用しているので、ここでテストする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全体にのみ一致する必要があることを意味します(そうでない場合は、townies
やchown
などに一致します)。最後に、(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
を含みます)
醜いですが、とにかくあなたが与えた例ではおそらくうまくいくと思います。