Comment obtenir la capture d'un groupe de fonctionnalités en Aller expressions régulières
Je suis le portage d'une bibliothèque de Ruby Aller, et viens de découvrir que les expressions régulières en Ruby ne sont pas compatibles avec Go (google RE2). Il est venu à mon attention que Ruby & Java (et d'autres langues utilisent les expressions régulières PCRE (perl compatible qui prend en charge de capturer les groupes)), j'ai donc besoin de ré-écrire mes expressions, de sorte que la compilation est ok en Aller.
Par exemple, j'ai la regex suivante:
`(?<Year>\d{4})-(?<Month>\d{2})-(?<Day>\d{2})`
Cela devrait accepter une entrée de type:
2001-01-20
La capture des groupes de permettre à l'année, le mois et le jour pour être capturé dans des variables. Pour obtenir la valeur de chaque groupe, il est très facile; il suffit d'index dans le retour des données appariées avec le nom du groupe et vous obtenez la valeur de retour. Ainsi, par exemple, pour obtenir l'année, quelque chose comme ce pseudo-code:
m=expression.Match("2001-01-20")
year = m["Year"]
C'est un modèle que j'utilise beaucoup dans mes expressions, et j'ai donc beaucoup de ré-écrire pour le faire.
Alors, est-il un moyen d'obtenir ce type de fonctionnalité dans le jeu de Go regexp; comment dois-je ré-écrire ces expressions?
Vous devez vous connecter pour publier un commentaire.
Ajouter un peu de Ps, tel que défini ici:
Croix de référence de capture des noms de groupe avec
re.SubexpNames()
.Et l'utilisation comme suit:
Regexp.SubexpNames
J'ai créé une fonction pour la manipulation des expressions d'url mais elle convient parfaitement à vos besoins. Vous pouvez le vérifier cette extrait, mais il fonctionne tout simplement comme ceci:
Vous pouvez utiliser cette fonction comme:
et la sortie sera:
Pour améliorer la RAM et le CPU utilisation sans appel anonyme des fonctions à l'intérieur de la boucle et sans copier des tableaux dans la mémoire à l'intérieur de la boucle avec la fonction "append" voir l'exemple suivant:
Vous pouvez stocker plus d'un sous-groupe avec texte multiligne, sans ajouter de chaîne avec " + " et sans utiliser de boucle for à l'intérieur de la boucle (à l'instar d'autres exemples posté ici).
De sortie:
Remarque: res[i][0] =~ match.groupe(0) Java
Si vous souhaitez stocker cette information utiliser un type struct:
Il est préférable d'utiliser anonyme groupes (amélioration du rendement)
À l'aide de "ReplaceAllGroupFunc" posté sur Github est une mauvaise idée parce que:
Chaque fois qu'un appel est fait à la fonction "append", est la copie du tableau la nouvelle position de mémoire
Si vous avez besoin de remplacer basée sur une fonction lors de la capture des groupes, vous pouvez utiliser ceci:
Exemple:
https://gist.github.com/elliotchance/d419395aa776d632d897
Moyen Simple pour déterminer les noms de groupe basée sur @VasileM réponse.
Avertissement: il n'est pas sur la mémoire/cpu/optimisation du temps d'
https://play.golang.org/p/Y9cIVhMa2pU