Compagno di testo: espressione regolare per sostituire le partite preservando il caso?


4

Come posso usare una singola ricerca / sostituisci per sostituire tutte le parole towncon villagepreservare il caso della prima lettera in questa frase:

Towns are small cities. I live in a town.

inserisci qui la descrizione dell'immagine


2
Deseleziona il caso ignorato ed esegui diverse sostituzioni?
Zoredache,

Risposte:


8

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

(E deseleziona ignora caso nella finestra di dialogo)

  • \b = limite di parole
  • (?:) = gruppo non acquisito
  • (?1:\u) = se il gruppo acquisito 1 converte il carattere successivo in maiuscolo

Questo è molto più intelligente del mio, definisci la strada da percorrere
kine,

Se potessi darti più di un voto, lo farei.
Cwd

Molto bello. Questa è normale sintassi regexp Perl?
Daniel Beck

1
@DanielBeck No, TextMate utilizza la libreria oniguruma . Perl 5 sembra supportare \u, ma non (?1:).
Lri,

Grazie per il link (richiede www.però)!
Daniel Beck

2

Sono sulla mia macchina di lavoro in questo momento, quindi nessun TextMate qui per me su cui testare, ma penso che questo potrebbe fare quello che vuoi:

Find:     \b(T)?((?<!T)t)?(?<! )own(s)?\b
Replace:  (?1:Village)(?2:village)$3

(Assicurati di deselezionare prima "Ignora caso".)

Spiegazione:

Il modello 'Trova' cerca le lettere ownprecedute da a To a t, quindi le cattura in $1e $2rispettivamente. L' (?<!T)interno della seconda cattura si assicura che non si ottengano entrambi allo stesso tempo (come Ttinsieme), per quanto improbabile sia probabilmente, e il (?<! )bit significa che ownnon può essere preceduto da uno spazio - questo dovrebbe impedirlo dall'abbinare la parola ownda sola. L'una \bo l'altra parte significa che dovrebbe corrispondere solo all'intera parola (altrimenti corrisponderà a cose come towniese chown). Infine, la (s)?parte acquisisce un finale s(se esiste) in $3.

Il modello di sostituzione utilizza inserimenti condizionali per determinare con cosa sostituire il testo. Nello pseudo-codice la stringa di sostituzione dice sostanzialmente:

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 poi aggiunge $3, che sarà vuoto o conterrà un s)

È brutto, ma penso che probabilmente funzionerà per l'esempio che hai dato comunque.


1
Ciò elimina \bown\bdove il primo \bnon è uno spazio.
Lri,

Ah. Immagino che sia quello che succede quando non testate le cose :(
kine,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.