Buscar / replace en Xcode usando expresiones regulares

Tengo las siguientes llamadas a funciones en varios lugares de mi class.

[myClass doOperationOne]; [myClass doOperationTwo]; [myClass doOperationThree]; 

En esas líneas, quiero search lo siguiente,

 [myClass doOperationOne [myClass doOperationTwo [myClass doOperationThree 

Y reemplácelo por el siguiente, (añadiendo WithOptions:[Permissions isOptionsAvailable] )

 [myClass doOperationOneWithOptions:[Permissions isOptionsAvailable]]; [myClass doOperationTwoWithOptions:[Permissions isOptionsAvailable]]; [myClass doOperationThreeWithOptions:[Permissions isOptionsAvailable]]; 

¿Cómo puedo hacer esto usando Single Expression Find / Replace?

NOTA: El comportamiento cambió en Xcode 6. La syntax \ 123 fue reemplazada por $ 123. También tenga en count que las líneas nuevas ahora pueden coincidir en regs, así que asegúrese de hojear antes de replace todo.

Agregando un argumento adicional a un método:

Para replace

 [* setFoo:*] 

con

 [* setFoo:* bar:value] 

tú lo haces

 (setFoo:)(.*)(\]) $1$2 bar:value] 

(cadena de búsqueda y cadena de reemploop, respectivamente).

o, si está en Xcode 5 o más viejo

 (setFoo:)(.*)(\]) \1\2 bar:value] 

(a continuación usa nueva syntax; intercambiar si está en Xcode 5 o anterior)

NOTA: ¡Todo lo escrito aquí se aplica a los methods de sustitución de NSString en NSString / NSMutableString cuando se utiliza NSRegularExpressionSearch !

En otras palabras, esta línea:

 [input replaceOccurrencesOfString:@"\n\\[([^\\]^\n]*)\\]\n" withString:@"\n///\n\n[$1]\n" options:NSRegularExpressionSearch range:(NSRange){0,input.length}]; 

convertirá todas las secuencias "[...]\n" (dejando, por ejemplo, "[...\n..." solo!] en "\n///\n\n[...]\n" , preservando ... usando $ 1.

Siempre hice esto a mano, pero en este caso, estaba agregando un OPCIONAL 'animate:', y el valor pnetworkingeterminado hasta este momento había sido SÍ, pero no quería NO, por lo que todas las llamadas tenían que actualizarse.

Más ejemplos:

Métodos en desuso (iOS)

dismissModalViewControllerAnimated:... deprecation

Para solucionar el dismissModalViewController reemplazándolo con un bloque de finalización vacío y manteniendo el valor animado:

 (dismissModalViewControllerAnimated:)(.*)(\]) dismissViewControllerAnimated:$2 completion:nil] 

presentModalViewController:animated: deprecation

 (presentModalViewController:)(.*)( animated:)(.*)(\]) presentViewController:$2$3$4 completion:nil] 

Diverso

PD … Liberación → PD … Destruir

Hace poco escribí una biblioteca ac con un montón de files con el prefijo PD y usé Create / Release como palabras key malloc / free, lo que me arrepentí, ya que puede hacer que la gente piense que retiene el recuento, por lo que quise renombrar PD<anything>Release( con PD<anything>Destroy( .

 ([\n\r ])(PD)(.*)Release\( $1$2$3Destroy( 

Como Core Graphics tiene CGPDFDocumentRelease y similar, tuve que asegurarme de que la palabra también comenzó con PD.


PDAssert( PDScannerPop...(...) ) ;

¡Estúpidamente puse aserciones alnetworkingedor del código funcional que quedaría vacío cuando! #ifdef DEBUG. Por suerte, sabía que todos comenzaron con PDAssert (PDScannerPop …. y terminó con) ;.

 (PDAssert\()(PDScannerPop)(.*)(\);) $2$3; 

No hay $ 1 aquí porque eso includeía el PDAssert( nuevamente. Tenga en count que me he dividido justo después del PDAssert (y estoy omitiendo el) en); en el 3er fragment que elimina los parentes extraños de la eliminación de PDAssert (.

Cómo lidiar con los paréntesis finales

Puede combinar todo, excepto ")" para hacer frente a regexp over-greedy reemplaza. Ejemplo:

 foo(replace(arg), bar) foo(newvalue(newarg), bar) 

¡Usando replace\((.*)\) Capturará replace(arg), bar) y el resultado será foo(newvalue(newarg) ! En su lugar, use replace\(([^\)]*)\) que grabará replace(arg) y salir , bar) solo.

La conversión de un grupo de properties de NSString de usar retener y / o fuerte (y cualquier otra cosa) para usar copy

 @property \(([^\)]*)[sr][te][rt][oa][ni][gn]([^\)]*)\)(.*)NSString(.*) @property ($1copy$2)$3NSString$4 

La cosa rara misteriosa en el centro coincide tanto con "fuerte" como con "retener".

De alguna manera, he logrado encontrar la respuesta (que es suficiente para mi necesidad aquí) al remitir la publicación: http://www.cocoabuilder.com/archive/xcode/273123-how-to-use-regular-expressions-in -xcode-find-replace.html , y método de testing y error.

Mi cadena de búsqueda es:

 (\[myClass.myMethod )(.*)(\];) 

Y, mi cadena de reemploop es:

 \1\2WithOptions:[Permissions isOptionsAvailable]\3 

Publique si hay alguna forma mejor que esta …

Nota para Xcode 8

Estaba intentando actualizar mi respuesta a continuación para Xcode 8, pero no pude hacerlo. Si tienes la respuesta, avísame.

Xcode 7

A less que ya fueras un genio de expresiones regulares, ahora es mucho más fácil hacerlo en Xcode. No necesita usar expresiones regulares en absoluto (pero puede hacerlo si todavía lo desea).

Ejemplo

Reemplace estas cadenas:

[myClass doOperation One ];
[myClass doOperation Two ];
[myClass doOperation Three ];

con estas cadenas

[myClass doOperation One WithOptions: [Permisos isOptionsAvailable]];
[myClass doOperation Two WithOptions: [Permisos isOptionsAvailable]];
[myClass doOperation Three WithOptions: [Permisos isOptionsAvailable]];

Los numbers en negrita muestran por qué un simple Buscar y Reemplazar no funcionará.

Preparar

Hay dos forms en que puede hacer Buscar y replace: expresión textual y regular

Haz clic en la lupa

introduzca la descripción de la imagen aquí

y "Editar opciones de búsqueda …"

introduzca la descripción de la imagen aquí

y elige uno de ellos.

introduzca la descripción de la imagen aquí

Método 1 – Textual

  • Ingrese [myClass doOperation in Find

  • Haga clic en la class de ampliación y elija "Insertar patrón"

introduzca la descripción de la imagen aquí

  • Elija "Cualquier caracter de Word"

introduzca la descripción de la imagen aquí

  • Agregar ]; encontrar

introduzca la descripción de la imagen aquí

  • Repita para la cadena de reemploop pero use WithOptions:[Permissions isOptionsAvailable]]; para la ultima parte

introduzca la descripción de la imagen aquí

  • Un único Reemplazar todo funcionará ahora.

Método 2: expresión regular

  • Asegúrese de que las expresiones regulares se seleccionan como se describe en Configuración anterior.

  • Use (\[myClass doOperation)(.*)(\];) Para la expresión regular

  • Use $1$2WithOptions:[Permissions isOptionsAvailable]$3 para la cadena de reemploop. Los $1 , $2 y $3 reemplazan los paréntesis en la expresión regular.

introduzca la descripción de la imagen aquí

  • Un único Reemplazar todo funcionará ahora.

  • Consulte este enlace para get más ayuda con las expresiones regulares.

Ver también

  • ¿Cómo puedo encontrar y replace dentro de una selección en Xcode?

No puedo encontrar nada que diga que capturar y replace la expresión regular es compatible DENTRO DE Xcode.

querrías

 \[myClass\.myMethod\sdoOperation([AZ][az]+)\] 

para capturar el número. aunque. para eso están los paréntesis.

En la versión actual de Xcode, creo que solo puedes search usando expresiones regulares. Reemplazar no te da esa flexibilidad. Si solo tiene tres methods que desea replace de esta manera, ejecutaría la búsqueda y replaceía tres veces. De lo contrario, modificaría mi código fuente en BASH usando awk o sed.