Как я могу использовать один поиск / замену, чтобы заменить все слова 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
)
Это некрасиво, но я думаю, что это, вероятно, сработает для того примера, который вы привели.