2016-05-07 3 views
1

J'ai un gros fichier avec des centaines de blocs de texte (parties d'appels de méthode C++) qui ressemblent au bloc Current ci-dessous et je souhaite utiliser Xcode's Regular expression remplacement pour changer chacun pour ressembler au bloc Desired ci-dessous, la capture des valeurs 0.89f, un nom, 0,1, 0,5 et 2.Comment utiliser Xcode `Find and Replace` sur des blocs de texte multilignes

Current Block

Desired Block

on notera que les deux blocs de départ et de l'esprit d'extrémité h new Zapp et //d.p.’s to show respectivement afin de me sauver des charges d'édition manuelle, je souhaite utiliser regex recherche et remplacer.

Le principal problème est que je face à la nature multi-line des blocs. Si l'on ignore que pour un moment, j'ai PRESQUE effectué une recherche et de remplacement sur les single-line blocs suivants:

actuel:

Current Single-Line

new Zapp (0.89f // defaultParameterValue , "A name" // name , 0.1 // min , 0.5 // max , 2 // d.p.'s to show

désiré:

Desired Single-Line

new Zapp (NormalisableRange<float> (0.1, 0.5) ,NormalisableRange<float> (0.1, 0.5).convertTo0to1(0.89f) , "A name" // name , 2 // d.p.'s to show

Rechercher et remplacer:

Trouver: Zapp\s+\((.*)\s+// defaultParameterValue\s+,\s+"(.*)"\s+\/\/\s+name\s+,\s+(.*)\s+\/\/\s+min\s+,\s+(.*)\s+\/\/\s+max\s+,\s+(.*)\s+\/\/\s+d.p.'s

Remplacer: Zapp (NormalisableRange<float> ($3, $4) ,NormalisableRange<float> ($3, $4).convertTo0to1($1) , "$2" // name , $5 // d.p.’s

Cette seule ligne solution a le problème supplémentaire espace blanc est vu après capture 1 (1 espace), capture 3 (4 espaces) et capture 5 (3 espaces), sinon cela fonctionne bien:

Comparison of Search and Replace output and ideal output

J'ai essayé d'éliminer les espaces blancs de la capture 1 (0.89f), la capture 3 (0,1) et capturer 5 (2) en utilisant [^\s]+ mais il n'a pas aidé donc si quelqu'un peut signaler la raison pour cela, je serais reconnaissant.

enter image description here

je peux, pour ce que ça vaut, chercher upper et lower en utilisant \s+ mais je ne peux pas le mettre tous ensemble pour obtenir le résultat souhaité.

J'ai vu quelques anciens messages en ligne qui suggèrent cette tâche pourrait ne pas être possible avec Xcode. Si c'est vrai, quelqu'un peut-il suggérer une approche alternative qui fera le travail?

Répondre

1

La raison en est que le .* est trop gourmand et correspond à l'espace qui aurait pu être égalé par le modèle \s+ mais pour ce sous-modèle gourmand.

Soit utiliser les paresseux/réticents .*?:

Zapp\s+\((.*?)\s+// defaultParameterValue\s+,\s+"(.*)"\s+\/\/\s+name\s+,\s+(.*?)\s+\/\/\s+min\s+,\s+(.*?)\s+\/\/\s+max\s+,\s+(.*?)\s+\/\/\s+d.p.'s 

Voir la regex demo

Ou définir la classe pour les flotteurs/entiers correspondant [-+\w.]+ (un peu pas précis, mais fera puisque le type de valeur attendue est connu) ou double littéraux cités ("([^"\\]*(?:\\.[^"\\]*)*)"):

Zapp\s+\(([-+\w.]+)\s+// defaultParameterValue\s+,\s+"([^"\\]*(?:\\.[^"\\]*)*)"\s+\/\/\s+name\s+,\s+([-+\w.]+)\s+\/\/\s+min\s+,\s+([-+\w.]+)\s+\/\/\s+max\s+,\s+([-+\d.]+)\s+\/\/\s+d.p.'s 

Voir another demo

+0

Vos deux réponses répondent à la question en général, donc je vais marquer ceci comme la bonne réponse. Le fait de coller votre code dans la zone Rechercher et remplacer de Xcode ne correspond pas au texte, mais cela semble être une limitation avec les blocs multilignes dans Xcode. J'ai fourni une réponse moi-même en utilisant AppCode qui permet un terme de recherche multi-ligne, juste pour aider les autres qui pourraient utiliser AppCode. Merci pour votre réponse, j'ai appris quelque chose. –

0

Veuillez consulter la réponse de Wiktor. Il donne deux solutions avec des démos qui satisfont le problème en général.

Cependant, grâce à la réponse de Rich Multi line search and replace tool, j'ai découvert AppCode by JetBrains va en effet faire une recherche sur plusieurs lignes et remplacer:

RECHERCHE:

new Zapp\s+\(([^\s]+)\s+// defaultParameterValue\n\s+"(.*)"\s+\/\/\s+name\s+, ([^\s]+)\s+// min\n,\s+([^\s]+)\s+// max\n,\s+([^\s]+)\s+// d.p.'s to show

REMPLACER:

new Zapp (NormalisableRange<float> ($3, $4)\n\t ,NormalisableRange<float> ($3, $4).convertTo0to1($1)\n\t\t\t , "$2" // name\n\t\t\t , $5 // d.p.'s to show