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.

hackerhasid
fuente

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+)
Bobulous
fuente
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.

CrnaStena
fuente
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 */
Hrvoje Golcic
fuente
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í

zeeawan
fuente
¿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.

Andreas Haferburg
fuente
¡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