Textmate: expressão regular para substituir os fósforos que preservam o caso?

4

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.

    
por cwd 04.11.2011 / 18:49

2 respostas

8

\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
por 06.11.2011 / 20:00
2

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.

    
por 06.11.2011 / 17:43