La ricerca di espressioni regolari sostituisce in Sublime Text 2


440

Sto cercando di sostituire la ricerca con espressioni regolari in Sublime Text 2. La documentazione su questo è piuttosto anemica. In particolare, voglio fare una sostituzione sui gruppi, quindi qualcosa come convertire questo testo:

Hello my name is bob

E questo termine di ricerca:

Trovare cosa: my name is (\w)+

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

Il termine di ricerca funziona bene, ma non riesco a trovare un modo per fare effettivamente una sostituzione usando il gruppo regexp.

Risposte:


584

Di solito un riferimento a ritroso è uno $1o \1(uno di barra rovesciata) per il primo gruppo di acquisizione (la prima corrispondenza di un modello tra parentesi), e in effetti Sublime supporta entrambe le sintassi. Allora prova:

my name used to be \1

o

my name used to be $1

Si noti inoltre che il modello di acquisizione originale:

my name is (\w)+

non è corretto e acquisirà solo la lettera finale del nome anziché l'intero nome. È necessario utilizzare il modello seguente per acquisire tutte le lettere del nome:

my name is (\w+)

15
tranne, non è vero $0?
Skylar Saveland,

11
No, $ 0 non viene utilizzato come riferimento indietro in un'espressione regolare (poiché è \0uguale al carattere null e \0dddviene utilizzato come escape per un carattere con punto di codice ddd). Tuttavia, $0sembra essere usato in Sublime2 come "punto di uscita" secondo questa pagina (anche se ho difficoltà a trovare abbastanza esempi per capire esattamente come viene utilizzato un segno di uscita in Sublime2).
Bobulous,

3
Il segno di uscita $0viene utilizzato in Sublime Text 2/3 per posizionare il cursore all'uscita da un'espansione dello snippet. Altro su frammenti .
jrhorn424,

2
$ 0 funziona ancora per il riferimento
all'indietro

2
$0è l'intera corrispondenza regex; $1è il primo gruppo di acquisizione.
Oletha,

103

A proposito, nella domanda sopra:

Per:

Hello, my name is bob

Trova parte:

my name is (\w)+

Con parte sostitutiva:

my name used to be \1

Ritornerebbe:

Hello, my name used to be b

Cambia trova parte in:

my name is (\w+)

E sostituire sarà quello che ti aspetti:

Hello, my name used to be bob

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


52

Importante: utilizzare le ( )parentesi nella stringa di ricerca

Mentre la risposta precedente è corretta, c'è una cosa importante da sottolineare! Tutti i segmenti corrispondenti nella stringa di ricerca che si desidera utilizzare nella stringa di sostituzione devono essere racchiusi tra ( )parentesi , altrimenti questi segmenti corrispondenti non saranno accessibili a variabili definite come $1, $2o \1, \2ecc.

Ad esempio, vogliamo sostituire 'em' con 'px' ma preservare i valori delle cifre:

    margin: 10em;  /* Expected: margin: 10px */
    margin: 2em;   /* Expected: margin: 2px */
  • Stringa di sostituzione: margin: $1pxomargin: \1px
  • Cerca stringa (CORRETTO): margin: ([0-9]*)em// tra parentesi
  • Cerca stringa (INCORRETTO): margin: [0-9]*em

ESEMPIO DI CASO CORRETTO: utilizzo della margin: ([0-9]*)emstringa di ricerca (con parentesi). Racchiudere il segmento corrispondente desiderato (es. $1O \1) tra ( )parentesi come segue:

  • Trova: margin: ([0-9]*)em (tra parentesi)
  • Sostituisci con: margin: $1px omargin: \1px
  • Risultato:
    margin: 10px;
    margin: 2px;

ESEMPIO DI CASO NON CORRETTO: utilizzo della margin: [0-9]*emstringa di ricerca (senza parentesi). Il seguente modello regex corrisponderà alle linee desiderate ma i segmenti corrispondenti non saranno disponibili nella stringa sostituita come variabili come $1o \1:

  • Trova: margin: [0-9]*em (senza parentesi)
  • Sostituisci con: margin: $1px omargin: \1px
  • Risultato:
    margin: px; /* `$1` is undefined */
    margin: px; /* `$1` is undefined */

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

Grazie per segnalarlo. Con (), posso eseguire la sostituzione con \ 1 in Sublime 3.
Jeffrey

47

Ecco una presentazione visiva della risposta approvata.

inserisci qui la descrizione dell'immagine


perché non sta trovando $_SESSION[(\w+)? grazie
Toni Michel Caubet,

Perché $, [, (e) sono caratteri speciali, quindi dovresti sfuggire a ogni carattere speciale con una barra rovesciata.
zeeawan,

25

Se si utilizzano più di 9 gruppi di acquisizione, è necessario utilizzare la sintassi ${10}.

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


Grazie! Ciò mi è stato utile per sostituire e aggiungere un numero alla fine del gruppo acquisito, ad es. Per aggiungere un 1secondo al gruppo di acquisizione è necessario utilizzare parentesi graffe come ${2}1; $ 21 si riferisce al 21 ° gruppo di acquisizione, che non esiste.
Eric

1

Guardando l'articolo della documentazione non ufficiale Sublime Text su Cerca e sostituisci , sembra che +(.+)sia il gruppo di acquisizione che potresti desiderare ... ma ho usato personalmente (.*)e ha funzionato bene. Per SOSTITUIRE nel modo in cui stai dicendo, ti potrebbe piacere questa conversazione nei forum , in particolare questo post che dice di usare semplicemente $1per usare il primo gruppo acquisito.

E poiché le immagini sono migliori delle parole ...

Prima: prima di trovare / sostituire

Dopo: dopo trovare / sostituire

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.