Ruby regex - gsub seul groupe capturé
Je ne suis pas bien sûr de comprendre comment les non-capture de groupes de travail. Je suis à la recherche d'une regex pour produire ce résultat: 5.214
. J'ai pensé à l'expression régulière ci-dessous, mais c'est le remplacement de tout, y compris la non-groupes de capture. Comment puis-je écrire une regex pour remplacer uniquement les groupes de capture?
"5,214".gsub(/(?:\d)(,)(?:\d)/, '.')
# => ".14"
Mon résultat souhaité:
"5,214".gsub(some_regex)
#=> "5.214
source d'informationauteur diasks2
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas.
gsub
remplace le match en entier; il ne fait rien de la phase de groupes. Il ne fait aucune différence si les groupes sont capturés ou pas.Afin d'atteindre le résultat, vous devez utiliser lookbehind et d'anticipation.
non de capturer les groupes consomme encore le match
utilisation
"5,214".gsub(/(\d+)(,)(\d+)/, '\1.\3')
ou
"5,214".gsub(/(?<=\d+)(,)(?=\d+)/, '.')
gsub
remplace le match en entier le moteur d'expression régulière produit.RTFMà la fois de capter/non-capture d'un groupe de constructions ne sont pas conservés. Toutefois, vous pouvez utiliser lookaround affirmations qui ne sont pas de "consommer" tous les caractères de la chaîne.
Explication: La
\K
séquence d'échappement réinitialise le point de départ du match et tout déjà consommé les personnages ne sont plus inclus. Cela étant dit, nous avons alors le chercher et le match de la virgule, et l'Anticipation Positif affirme qu'un chiffre suit.Je ne sais rien à propos de ruby.
Mais de ce que je vois dans le tutoriel
gsub dire remplacer,
le modèle doit être
/(?<=\d+),(?=\d+)/
il suffit de remplacer la virgule par pointou, utilisez la capture
/(\d+),(\d+)/
remplacer la chaîne avec"\1.\2"
?Vous n'avez pas besoin de regexp pour obtenir ce dont vous avez besoin:
'1,200.00'.tr('.','!').tr(',','.').tr('!', ',')
1,200!00
)1.200!00
)1.200,00
)Il est également possible d'utiliser
Regexp.last_match
(également disponible via le$~
) dans le bloc de la version pour accéder à l'intégralité deMatchData
:Cet échelles de mieux impliquer davantage des cas d'utilisation.
Nota bene, à partir de l'Ruby docs: