48 votes

Rechercher / Remplacer dans Xcode en utilisant une expression régulière

J'ai les appels de fonction suivants à plusieurs endroits de ma classe.

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

Dans ces lignes, je veux rechercher ce qui suit,

 [myClass doOperationOne
[myClass doOperationTwo
[myClass doOperationThree
 

Et remplacez-les par ce qui suit (en ajoutant WithOptions:[Permissions isOptionsAvailable] )

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

Comment puis-je faire cela en utilisant une seule expression régulière recherchée / remplacée?

65voto

Kalle Points 6804

REMARQUE: Le comportement est modifié dans Xcode 6. L' \123 syntaxe a été remplacé par $123. Aussi être avertis que les retours à la ligne peuvent maintenant être mis en correspondance des reg exps alors assurez-vous de lire avant de Remplacer-Alling

Ajout d'un argument à une méthode:

Pour remplacer

[* setFoo:*]

avec

[* setFoo:* bar:value]

vous n'

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

(recherche de chaîne et de la chaîne de remplacement, respectivement).

ou, si Xcode 6

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

(ci-dessous utilise une nouvelle syntaxe; swap si sur Xcode 5 ou plus)

Toujours fait à la main, mais dans ce cas, j'ai été l'ajout d'une OPTION 'animer:' le drapeau, et la valeur par défaut jusqu'à ce point avait été OUI, mais je ne voulais PAS, de sorte que chaque appel devait être mis à jour.

D'autres exemples:

Des méthodes obsolètes (iOS)

dismissModalViewControllerAnimated:... autodérision

Pour résoudre le obsolète dismissModalViewController de le remplacer par un vide d'achèvement bloc de soutènement et d'animation de la valeur:

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

presentModalViewController:animated: autodérision

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

Divers

PD...Libération → PD Détruire...

J'ai récemment écrit une bibliothèque en c avec un tas de fichiers avec le préfixe PD et j'ai utilisé de Créer/Release que malloc/free mots clés, j'ai regretté que cela peut faire réfléchir les gens de conserver le comptage est fait, donc j'ai voulu renommerPD<anything>Release( avec PD<anything>Destroy(.

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

Depuis Graphiques de Base a CGPDFDocumentRelease et similaires, j'ai eu à assurer le mot a commencé avec la maladie de parkinson ainsi.


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

J'avais bêtement mis affirmations autour du code fonctionnel qui allait devenir vide quand !#ifdef DEBUG. Heureusement, je savais que toutes ces a commencé avec PDAssert(PDScannerPop.... et s'est terminée avec );.

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

Pas de $1 ici parce que ce serait inclure l' PDAssert( de nouveau. Notez que j'ai partagé à droite après le PDAssert( et quitte l' ) dans ); dans le 3ème morceau qui supprime l'excédent des parens de la suppression de PDAssert(.

Traiter avec des parenthèses

Vous pouvez correspondre avec tout sauf ")" pour faire face à la sur-gourmand regexp remplace. Exemple:

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

À l'aide de replace\((.*)\) saisira replace(arg), bar) et le résultat sera foo(newvalue(newarg)! Au lieu d'utiliser replace\(([^\)]*)\) qui saisira replace(arg) et laissez , bar) seulement.

La conversion d'un tas de NSString propriétés de l'utilisation de conserver et/ou forte (et tout le reste) à l'aide de la copie

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

L'étrange sr te rt chose dans le centre correspond à la fois à "fort" et "conserver".

43voto

EmptyStack Points 32089

D'une certaine manière, j'ai réussi à trouver la réponse (ce qui est suffisant pour mon besoin ici) en se référant à la poste: http://www.cocoabuilder.com/archive/xcode/273123-how-to-use-regular-expressions-in-xcode-find-replace.htmlet méthode d'essai et erreur.

Ma Trouver de la chaîne est:

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

Et, ma Remplacer la chaîne est:

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

Merci de poster si il ya une meilleure façon que cela..

1voto

griotspeak Points 3582

Je ne trouve rien qui indique que la capture et le remplacement d'expressions régulières sont pris en charge DANS Xcode.

vous voudriez

 \[myClass\.myMethod\sdoOperation([A-Z][a-z]+)\] 
 

pour capturer le nombre. bien que. c'est à cela que servent les parenthèses.

1voto

jakev Points 2068

Dans la version actuelle de XCode, je pense que vous ne pouvez utiliser que des expressions régulières. Remplacer ne vous donne pas cette flexibilité. Si vous ne souhaitez remplacer que trois méthodes de cette manière, je lancerais la recherche et le remplacement trois fois. Sinon, je modifierais mon code source dans BASH en utilisant awk ou sed.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X