2012-08-05 6 views
353

Sto cercando di sostituire la ricerca con le espressioni regolari in Sublime Text 2. Lo documentation on this è piuttosto anemico. In particolare, voglio fare una sostituzione in gruppi, in modo da qualcosa come la conversione di questo testo:La ricerca di espressioni regolari sostituisce in Sublime Text 2

Hello my name is bob

E questo termine di ricerca:

Trova: my name is (\w)+

Sostituire con: my name used to be $(1)

Il termine di ricerca funziona correttamente ma non riesco a trovare un modo per eseguire effettivamente una sostituzione utilizzando il gruppo regexp.

risposta

469

Di solito un riferimento all'indietro è $1 o \1 (backslash uno) per il primo gruppo di cattura (la prima corrispondenza di un modello tra parentesi). Così magari provare:

my name used to be \1 

o

my name used to be $1 

UPDATE: Come molte persone hanno fatto notare, il vostro modello di cattura originale non è corretto e catturerà solo la lettera finale del nome piuttosto che il nome intero Si dovrebbe usare il seguente modello per catturare tutte le lettere del nome:

my name is (\w+) 
+40

Entrambi lavoreranno in Sublime Text. – furq

+12

eccetto, non è '$ 0'? –

+8

No, $ 0 non viene utilizzato come riferimento di ritorno in un'espressione regolare (poiché '\ 0' è uguale al carattere null e' \ 0ddd' è usato come escape per un carattere con codice punto ddd). Tuttavia, '$ 0' sembra essere usato in Sublime2 come" exit mark "in base a [questa pagina] (https://sublime-text-unofficial-documentation.readthedocs.org/en/latest/reference/snippets.html ? highlight = $ 0) (anche se ho difficoltà a trovare un numero sufficiente di esempi per capire esattamente come viene utilizzato un segno di uscita in Sublime2). – Bobulous

92

Tra l'altro, nella domanda di cui sopra:

Per:

Hello, my name is bob 

parte Trova:

my name is (\w)+ 

Con sostituzione parte:

my name used to be \1 

sarebbe tornato:

Hello, my name used to be b 

Change trovare parte:

my name is (\w+) 

e sostituirlo sarà quello che vi aspettate:

Hello, my name used to be bob 

Mentre (\ w) + corrisponderà "bob", non è il raggruppamento che desideri sostituire.

37

Utilizzare i) parentesi nel stringa di ricerca

C'è una cosa importante da sottolineare (!Tutti i segmenti corrispondenti nella stringa di ricerca che si desidera utilizzare nella stringa di sostituzione devono essere abbracciato da() parentesi, altrimenti questi segmenti abbinate non saranno raggiungibili con le variabili come $ 1, $ 2, .. .nor \ 1, \ 2, .. e così via

ESEMPIO:

Vogliamo sostituire 'em' con 'px' ma preservare i valori numerici:

margin: 10em 
margin: 2em 

Quindi usiamo il margin: $1px a s la stringa di sostituzione.


CORRETTO: abbracciare il $1 segmento corrispondente desiderata () parentesi come segue:

TROVA: margin: ([0-9]*)em (con parentesi)

sostituire in: margin: $1px

RESULT:

margin: 10px 
margin: 2px 

ERRORE: La seguente espressione regolare corrisponderà le linee desiderate ma segmenti abbinati non sarà disponibile in stringa sostituito con variabili quali $1:

TROVA: margin: [0-9]*em (senza parentesi)

Sostituisci per: margin: $1px

RISULTATO: ($1 è indefinito)

margin: px 
margin: px 
+1

Grazie, questa risposta indica davvero un fatto interessante che ha risolto il mio problema. – Enkk

15

Si noti che se si utilizzano più di 9 gruppi di acquisizione è necessario utilizzare la sintassi ${10}.

$10 o \10 o \{10} sarà non lavoro.

22

Ecco una presentazione visiva della risposta approvata.

enter image description here