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.