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 Find / Replace?

42
demandé sur EmptyStack 2011-01-24 08:06:25

5 réponses

Remarque: le comportement a changé dans Xcode 6. La syntaxe \ 123 a été remplacée par $ 123. Soyez également averti que les nouvelles lignes peuvent maintenant être appariées dans Reg exps alors assurez-vous de parcourir avant Replace-Alling

Ajout d'un argument supplémentaire à une méthode:

Pour remplacer

[* setFoo:*]

Avec

[* setFoo:* bar:value]

Vous le faites

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

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

Ou, si sur Xcode 5 ou plus

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

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

NOTE: Tout ce qui est écrit ici s'applique aux méthodes de remplacement de chaîne dans NSString/NSMutableString lors de l'utilisation de NSRegularExpressionSearch!

En d'autres termes, cette ligne:

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

Convertira toutes les séquences "[...]\n" (en laissant par exemple "[...\n..." seul!) dans "\n///\n\n[...]\n", en préservant ... en utilisant $1.

Toujours fait cela à la main mais dans ce cas, j'ajoutais un drapeau facultatif 'animate:', et la valeur par défaut jusqu'à ce point était oui, mais je voulais Non, donc chaque appel avait à mettre à jour.

Plus d'exemples:

Méthodes obsolètes (iOS)

dismissModalViewControllerAnimated:... la dépréciation

Pour corriger le dismissModalViewController obsolète en le remplaçant par un bloc d'achèvement vide et en conservant la valeur animée:

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

presentModalViewController:animated: la dépréciation

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

Divers

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

J'ai récemment écrit une bibliothèque c avec un tas de fichiers avec le préfixe PD et j'ai utilisé Create / Release comme malloc / free keywords, ce que j'ai regretté car cela peut faire penser aux gens que le comptage des retenues est conservé, donc je voulais renommer PD<anything>Release( avec PD<anything>Destroy(.

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

Comme Core Graphics a CGPDFDocumentRelease et similaire, je devais m'assurer que le mot a commencé avec PD aussi.


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

J'avais bêtement mis des assertions autour du code fonctionnel qui deviendrait vide quand !# ifdef DEBUG. Heureusement je savais que tout cela a commencé avec PDAssert (PDScannerPop.... et s'est terminée avec );.

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

Pas de 1 $ ici parce que cela inclurait à nouveau le PDAssert(. Notez que je me suis séparé juste après le PDAssert (et je laisse de côté le ) in); dans le 3ème morceau qui supprime les parens excédentaires de supprimer PDAssert(.

Traiter avec des parenthèses

Vous pouvez faire correspondre tout sauf") " pour traiter les remplacements regexp trop gourmands. Exemple:

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

En Utilisant {[30] } va saisir replace(arg), bar) et le résultat sera foo(newvalue(newarg)! Utilisez plutôt replace\(([^\)]*)\) qui va saisir replace(arg) et laisser , bar) seul.

convertir un tas de propriétés NSString d'utiliser retain et / ou strong (et tout le reste) en utilisant copy

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

La chose étrange sr te rt au centre correspond à la fois à " strong "et à"retain".

61
répondu Kalle 2015-04-12 01:10:09

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

Mon Trouver chaîne est:

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

Et Remplacer chaîne est:

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

Veuillez poster s'il y a un meilleur moyen que cela..

41
répondu EmptyStack 2013-10-30 11:26:09

Remarque pour Xcode 8

J'essayais de mettre à jour ma réponse ci-dessous pour Xcode 8, mais je ne pouvais pas le faire. Si vous avez la réponse, faites-le moi savoir.

Xcode 7

Sauf si vous étiez déjà un génie de l'expression régulière, c'est beaucoup plus facile à faire dans Xcode maintenant. Vous n'avez pas besoin d'utiliser des expressions régulières (mais vous pouvez si vous le souhaitez).

Exemple

Remplacez ces chaînes:

[maclasse doOperationOn];
[maclasse doOperationDeux];
[maclasse doOperationTrois];

, Avec ces chaînes

[maclasse doOperationUnWithOptions:[Autorisations isOptionsAvailable]];
[maclasse doOperationDeuxWithOptions:[Autorisations isOptionsAvailable]];
[maclasse doOperationTroisWithOptions:[Autorisations isOptionsAvailable]];

Les chiffres en gras montrent pourquoi un simple Find and Replace ne sera pas travail.

Configuration

Il y a deux façons de trouver et de remplacer: textuel et Expression régulière

Cliquez sur la loupe

entrez la description de l'image ici

Et " Modifier Les Options De Recherche..."

entrez la description de l'image ici

Et choisissez l'un d'entre eux.

entrez la description de l'image ici

Méthode 1-Textuel

  • Saisissez [myClass doOperation en Trouver

  • Cliquez sur la classe grossissante et choisissez " Insérer Motif "

entrez la description de l'image ici

  • Choisissez "Tous Les Caractères De Mot"

entrez la description de l'image ici

  • Ajouter ]; pour Trouver

entrez la description de l'image ici

  • répétez pour la chaîne de remplacement mais utilisez WithOptions:[Permissions isOptionsAvailable]]; pour la dernière partie.

entrez la description de l'image ici

  • un seul remplacer tout va fonctionner maintenant.

Méthode 2-Expression Régulière

  • Assurez-vous que régulier Les Expressions sont sélectionnées comme décrit dans la configuration ci-dessus.

  • Utiliser (\[myClass doOperation)(.*)(\];) pour l'Expression Régulière

  • Utiliser $1$2WithOptions:[Permissions isOptionsAvailable]$3 pour la Chaîne de Remplacement. L'$1, $2, et $3 remplacer les parenthèses dans l'expression régulière.

entrez la description de l'image ici

  • Un seul remplacer tout fonctionnera maintenant.

  • Voir ce lien pour plus d'aide avec les expressions régulières.

Voir aussi

15
répondu Suragch 2017-05-23 12:34:08

Je ne trouve rien qui dise que la capture et le remplacement des expressions régulières sont pris en charge dans Xcode.

Vous voudriez

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

Pour capturer le nombre. bien. c'est ce que les parenthèses sont pour.

1
répondu griotspeak 2011-01-24 05:17:59

Dans la version actuelle de Xcode, je crois que vous ne pouvez rechercher qu'en utilisant des expressions régulières. Remplacer ne vous donne pas cette flexibilité. Si vous n'avez que trois méthodes que vous souhaitez remplacer de cette manière, je lancerais la recherche et remplacerais trois fois. Sinon, je modifierais mon code source dans BASH en utilisant awk ou sed.

1
répondu jakev 2016-12-23 20:56:07