La búsqueda de expresiones regulares reemplaza en Sublime Text 2


440

Estoy buscando hacer una búsqueda de reemplazo con expresiones regulares en Sublime Text 2. La documentación sobre esto es bastante anémica. Específicamente, quiero hacer un reemplazo en grupos, así que algo como convertir este texto:

Hello my name is bob

Y este término de búsqueda:

Encontrar que: my name is (\w)+

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

El término de búsqueda funciona bien, pero no puedo encontrar una manera de hacer un reemplazo usando el grupo regexp.

Respuestas:


584

Por lo general, una referencia inversa es $1o \1(barra diagonal inversa uno) para el primer grupo de captura (la primera coincidencia de un patrón entre paréntesis), y de hecho Sublime admite ambas sintaxis. Entonces intenta:

my name used to be \1

o

my name used to be $1

También tenga en cuenta que su patrón de captura original:

my name is (\w)+

es incorrecto y solo capturará la letra final del nombre en lugar del nombre completo. Debe usar el siguiente patrón para capturar todas las letras del nombre:

my name is (\w+)

15
excepto, ¿no es así $0?
Skylar Saveland

11
No, $ 0 no se usa como referencia en una expresión regular (porque \0es igual al carácter nulo y \0dddse usa como escape para un carácter con punto de código ddd). Sin embargo, $0parece que se usa en Sublime2 como una "marca de salida" de acuerdo con esta página (aunque tengo problemas para encontrar suficientes ejemplos para determinar exactamente cómo se usa una marca de salida en Sublime2).
Bobulous

3
La marca de salida $0se usa en Sublime Text 2/3 para colocar el cursor en la salida de una expansión de fragmentos. Más sobre fragmentos .
jrhorn424

2
$ 0 todavía funciona para hacer referencia a la expresión completa en Sublime Text 2
sturrockad

2
$0es toda la coincidencia de expresiones regulares; $1Es el primer grupo de captura.
Oletha

103

Por cierto, en la pregunta anterior:

Por:

Hello, my name is bob

Encuentra parte:

my name is (\w)+

Con pieza de repuesto:

my name used to be \1

Volvería:

Hello, my name used to be b

Cambiar buscar parte a:

my name is (\w+)

Y reemplazar será lo que esperas:

Hello, my name used to be bob

Si bien (\ w) + coincidirá con "bob", no es la agrupación que desea reemplazar.


52

Importante: use los ( )paréntesis en su cadena de búsqueda

Si bien la respuesta anterior es correcta, ¡hay algo importante que enfatizar! Todos los segmentos coincidentes en su cadena de búsqueda que desea usar en su cadena de reemplazo deben estar encerrados entre ( )paréntesis , de lo contrario, estos segmentos coincidentes no serán accesibles para variables definidas como $1, $2o \1, \2etc.

Por ejemplo, queremos reemplazar 'em' con 'px' pero preservar los valores de los dígitos:

    margin: 10em;  /* Expected: margin: 10px */
    margin: 2em;   /* Expected: margin: 2px */
  • Cadena de reemplazo: margin: $1pxomargin: \1px
  • Cadena de búsqueda (CORRECTA): margin: ([0-9]*)em// con paréntesis
  • Cadena de búsqueda (INCORRECTA): margin: [0-9]*em

EJEMPLO DE CASO CORRECTO: Uso de margin: ([0-9]*)emcadena de búsqueda (con paréntesis). Incluya el segmento coincidente deseado (p. Ej. $1O \1) entre ( )paréntesis de la siguiente manera:

  • Buscar: margin: ([0-9]*)em(entre paréntesis)
  • Reemplazar por: margin: $1pxomargin: \1px
  • Resultado:
    margin: 10px;
    margin: 2px;

EJEMPLO DE CASO INCORRECTO: Usar una margin: [0-9]*emcadena de búsqueda (sin paréntesis). El siguiente patrón de expresiones regulares coincidirá con las líneas deseadas, pero los segmentos coincidentes no estarán disponibles en la cadena reemplazada como variables como $1o \1:

  • Encontrar: margin: [0-9]*em (sin paréntesis)
  • Reemplazar por: margin: $1pxomargin: \1px
  • Resultado:
    margin: px; /* `$1` is undefined */
    margin: px; /* `$1` is undefined */

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

Gracias por mencionarlo. Con (), puedo hacer el reemplazo con \ 1 en Sublime 3.
Jeffrey

47

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

ingrese la descripción de la imagen aquí


¿Por qué no se encuentra $_SESSION[(\w+)? gracias
Toni Michel Caubet

Como $, [, (, y) son caracteres especiales, debe escapar de cada carácter especial con una barra diagonal inversa.
zeeawan

25

Tenga en cuenta que si usa más de 9 grupos de captura, debe usar la sintaxis ${10}.

$10o \10o \{10}será no trabajar.


¡Gracias! Esto fue útil para mí para reemplazar y agregar un número al final del grupo capturado, por ejemplo, para agregar un 1al segundo grupo de captura, necesita usar llaves como ${2}1; $ 21 se refiere al grupo de captura 21, que no existe.
Eric

1

Al mirar el artículo de Sublime Text Noofficial Documentation sobre Buscar y reemplazar , parece que +(.+)es el grupo de captura que puede desear ... pero yo personalmente lo utilicé (.*)y funcionó bien. Para REEMPLAZAR de la manera que usted dice, puede que le guste esta conversación en los foros , específicamente esta publicación que dice simplemente usar $1para usar el primer grupo capturado.

Y como las imágenes son mejores que las palabras ...

Antes de: antes de buscar / reemplazar

Después: después de buscar / reemplazar

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.