4

Как я могу использовать один поиск / замену, чтобы заменить все слова town на village сохраняя регистр первой буквы в этом предложении:

Towns are small cities. I live in a town.

2 ответа2

8

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

(И снимите флажок игнорировать регистр в диалоговом окне)

  • \b = граница слова
  • (?:) = группа без захвата
  • (?1:\u) = если захвачена группа 1, преобразовать следующий символ в верхний регистр
2

Я сейчас на своей рабочей машине, поэтому здесь нет 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)

Это некрасиво, но я думаю, что это, вероятно, сработает для того примера, который вы привели.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .