\b(?:(T)|t)own(s?)\b → (?1:\u)village$2
(e desmarque ignorar maiúsculas na caixa de diálogo)
-
\b= limite de palavras -
(?:)= grupo sem captura -
(?1:\u)= se capturado grupo 1, em seguida, converter o próximo caractere em maiúscula
Como posso usar uma única pesquisa / substituição para substituir todas as palavras town por village preservando o caso da primeira letra desta frase:
Towns are small cities. I live in a town.
Estou na minha máquina de trabalho agora, então não tenho TextMate aqui para testar, mas acho que isso pode fazer o que você quer:
Find: \b(T)?((?<!T)t)?(?<! )own(s)?\b
Replace: (?1:Village)(?2:village)$3
(Certifique-se de desmarcar 'Ignorar maiúsculas e minúsculas' primeiro).
Explicação:
O padrão "Encontrar" pesquisa as letras own precedidas por T ou t e, em seguida, as captura em $1 e $2 , respectivamente. O (?<!T) dentro da segunda captura garante que você não obtém os dois ao mesmo tempo (como Tt juntos), por mais improvável que seja, e o (?<! ) significa que own pode ser precedido por um espaço - isso deve impedir que ele corresponda a palavra own por si mesmo. O \b de cada lado significa que ele deve corresponder apenas à palavra inteira (caso contrário, ele corresponderá a itens como townies e chown ). Por fim, a parte (s)? captura um% finals (se existir) para $3 .
O padrão de substituição usa inserções condicionais para determinar o que substituir o texto por. No pseudo-código, a string de substituição diz basicamente:
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 }
(E, em seguida, adiciona $3 , que estará vazio ou conterá s )
É feio, mas acho que provavelmente funcionará para o exemplo que você deu de qualquer maneira.