2012-08-05 16 views
353

Estoy buscando hacer reemplazar por expresiones regulares en Sublime Text 2. El documentation on this es bastante anémico. En concreto, quiero hacer una sustitución en grupos, por lo que algo como la conversión de este texto:Búsqueda de expresión regular reemplazar en Sublime Text 2

Hello my name is bob

Y este término de búsqueda:

Encuentra lo que: my name is (\w)+

Sustituir por: my name used to be $(1)

El término de búsqueda funciona bien, pero no puedo encontrar la manera de reemplazarlo con el grupo de expresiones regulares.

Respuesta

469

Por lo general, una referencia retrospectiva es $1 o \1 (barra invertida) para el primer grupo de captura (la primera coincidencia de un patrón entre paréntesis). Así que tal vez probar:

my name used to be \1 

o

my name used to be $1 

ACTUALIZACIÓN: Como varias personas han señalado, su patrón de captura original es incorrecto y sólo capturará la última letra del nombre en lugar de la Nombre completo. Se debe utilizar la siguiente distribución para capturar todas las letras del nombre:

my name is (\w+) 
+40

Ambos trabajarán en Sublime Text. – furq

+12

excepto, ¿no es '$ 0'? –

+8

No, $ 0 no se utiliza como referencia retrospectiva en una expresión regular (porque '\ 0' es igual al carácter nulo, y' \ 0ddd' se usa como escape para un caracter con el punto de código ddd). Sin embargo, '$ 0' parece usarse en Sublime2 como una" marca de salida "según [esta página] (https://sublime-text-unofficial-documentation.readthedocs.org/en/latest/reference/snippets.html ? highlight = $ 0) (aunque tengo problemas para encontrar suficientes ejemplos para calcular exactamente cómo se usa una marca de salida en Sublime2). – Bobulous

92

Por cierto, en la pregunta anterior:

Por:

Hello, my name is bob 

Búsqueda parte:

my name is (\w)+ 

Con la pieza de repuesto:

my name used to be \1 

regresarían:

Hello, my name used to be b 

Cambio encontrar parte de:

my name is (\w+) 

y reemplazar será lo que espera:

Hello, my name used to be bob 

Mientras que (\ w) + coincidirá "bob", no es la agrupación que desea para el reemplazo.

37

uso de los paréntesis() en su cadena de búsqueda

Hay una cosa importante a destacar!Todos los segmentos coincidentes en su cadena de búsqueda cadena de reemplazo deben ser abrazados por() paréntesis, de lo contrario estos segmentos coincidentes no serán alcanzables con variables tales como $ 1, $ 2, .. .nor \ 1, \ 2, .., etc

Ejemplo:

queremos sustituir a 'em' con 'px' pero preservar los valores numéricos:

margin: 10em 
margin: 2em 

Así que utilizamos el margin: $1px a s la cadena de reemplazo.


CORRECTO: Abrazo la $1 segmento emparejado deseado por () paréntesis, de la siguiente manera:

FIND: margin: ([0-9]*)em (con paréntesis)

REPLACE para: margin: $1px

RESULTADO:

margin: 10px 
margin: 2px 

MAL: El siguiente patrón de expresión regular coincidirá con las líneas deseadas pero segmentos coincidentes no estará disponible en la cadena reemplazado como variables tales como $1:

FIND: margin: [0-9]*em (sin paréntesis)

REPLACE para: margin: $1px

RESULTADO: ($1 es indefinido)

margin: px 
margin: px 
+1

Gracias, esta respuesta realmente señala un hecho interesante que resolvió mi problema. – Enkk

15

Tenga en cuenta que si se utiliza más de 9 grupos de captura tiene que utilizar la sintaxis ${10}.

$10 o \10 o \{10} se no trabajo.

22

Aquí hay una presentación visual de la respuesta aprobada.

enter image description here

Cuestiones relacionadas