Как я могу использовать один поиск / замену, чтобы заменить все слова town на village сохраняя регистр первой буквы в этом предложении:
Towns are small cities. I live in a town.

Как я могу использовать один поиск / замену, чтобы заменить все слова 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
(Обязательно снимите флажок «Игнорировать регистр».)
Объяснение:
Шаблон «Поиск» ищет own буквы, которым предшествуют буквы T или t , а затем записывает их в $1 и $2 соответственно. (?<!T) внутри второго захвата гарантирует, что вы не получите их обоих одновременно (как Tt вместе), так же маловероятно, как это, вероятно, и (?<! ) означает , что по own не может предшествовать пробел - это должно предотвратить его соответствие слова own сам по себе. \b с обеих сторон означает , что он должен соответствовать только слово целиком ( в противном случае он будет соответствовать вещи , как и 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)
Это некрасиво, но я думаю, что это, вероятно, сработает для того примера, который вы привели.