Question

Ce n'est pas aussi simple qu'il n'y paraît. La plupart d'entre vous pensent probablement du /([A-Z])/_$1/ regex comme je l'ai trouvé partout sur Internet, mais ma situation est un peu plus compliquée. Ma chaîne source contient plus de contenu que je ne pas veulent avoir converti une partie avant que je faire .

Considérons 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)

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

Il 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 partout dans mes recherches.

Edit: bien sûr, je me rends compte qu'il n'y a pas dans les capitales « fonction publique » qui laissent la sécurité. Mais, cette recherche et la substitution seront en cours d'exécution contre des blocs de code, et je veux faire en sorte que la chaîne je modifie commence avec « fonction publique ».

Était-ce utile?

La solution

recherche d'abord pour les définitions de fonction, puis sur chaque match, insérer 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-mot clé 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 se trouve la dernière lettre avant une séquence en majuscules / minuscules qui composent Camel.

Vous n'avez pas spécifié quelle langue que vous utiliserez, alors voici 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 une fonction de 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 modulo (le "%") pour la mise en forme, semblable à sprintf dans, par exemple le langage 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 - Comment pouvez-vous diviser un « caps » chaîne délimitée dans un tableau

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top