2009-07-13 8 views
2

Ce n'est pas aussi simple qu'il n'y paraît. La plupart d'entre vous pensent probablement à la regex /([A-Z])/_$1/ comme je l'ai trouvé partout sur Internet, mais ma situation particulière est légèrement plus compliquée. Ma chaîne source contient plus de contenu que ne veulent pas converti avant une partie que je faire.Convertit le setter Pascal en un nom de variable séparé par un trait de soulignement

Tenir compte d'un setter régulier:

public function setUserId() 

Bien sûr, cette méthode manque un paramètre. Peut-être que j'ai beaucoup de ces méthodes. Je voudrais convertir cette ligne en

public function setUserId($user_id) 

qui est une chose assez simple à considérer, mais pas si simple que je médite plus profondément. C'est similaire à Andreas_D dans this thread, mais avec le défi supplémentaire d'essayer de modifier itérativement le nom de la variable ...

Cela va probablement être quelque chose d'évident en utilisant des expressions régulières, mais je suis encore assez nouveau avec eux. De toute façon, je ne peux pas trouver une solution décente à ce problème n'importe où dans mes recherches. Edit: bien sûr, je me rends compte qu'il n'y a pas de majuscule en "fonction publique" qui le laisse en sécurité. Mais, cette recherche & substitution sera exécutée contre des blocs de code, et je veux m'assurer que la chaîne que je suis modifié commence avec "fonction publique".

Répondre

2

La première recherche de définitions de fonction, puis à chaque correspondance, insère un paramètre basé sur le nom de la fonction.

/\b(function\s+set([A-Z]\w*))\b\s*\(\)/g 

Ce modèle vous donnera matchs avec le function -keyword et le nom de la fonction dans le groupe 1, et la partie de CamelCase le nom de la fonction dans le groupe 2.

/([a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z]))/g 

Ce modèle sera trouver la dernière lettre avant une séquence majuscule/minuscule qui compose le cas du chameau.

Vous n'avez pas spécifié quelle langue que vous utiliserez, voici donc une démonstration en utilisant Python:

import re 

pattern1 = re.compile(r'\b(function\s+set([A-Z]\w*))\b\s*\(\s*\)') 
pattern2 = re.compile(r'([a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z]))') 

def fix_setters(code): 
    def replacer(match): 
     var_name = pattern2.sub(r'\1_', match.group(2)).lower() 
     return "%s($%s)" % (match.group(1), var_name) 
    return pattern1.sub(replacer, code) 

La dernière ligne (« return pattern1.sub(replacer, code) »), utilise un rappel pour générer le texte à substituer . Il devrait y avoir des fonctionnalités similaires dans la plupart des langues.

Python (avant la version 3.0) utilise l'opérateur de module ("%") pour le formatage, similaire à sprintf dans p. la langue C.

Exemple:

>>> s = """\ 
... public function setUserName() { 
... blaha 
... } 
... """ 
>>> print s 
public function setUserName() { 
    blaha 
} 

>>> print fix_setters(s) 
public function setUserName($user_name) { 
    blaha 
} 

>>> 

Plus d'informations: .NET - How can you split a “caps” delimited string into an array?

+0

IMPRESSIONNANT MizardX. C'est exactement ce dont j'avais besoin et ça marche très bien. Je ne connais pas encore Python (j'ai toujours l'intention d'apprendre ...) mais c'est un langage très intuitif, facile à lire. Très bon choix pour un cas de test. – JMTyler

Questions connexes