2 votes

Recherche et remplacement d'un nombre variable d'éléments dans une chaîne de caractères à l'aide de regex

J'ai plusieurs cordes qui ressemblent à ça :

sum({foo, c[0663, 0667, 0673, 0677, 0693, 0697, 0703, 0707]})
sum({foo, c[0663, 0667, 0673, 0677, 0693]})
sum({foo, c[0697, 0703, 0707]})
sum({foo, c[0693, 0697, 0703, 0707]})

Je peux les trouver tous, en utilisant cette regex :

sum\(\{foo, c\[(?:(\d{4})(, )?)+\]\}\)

Le problème apparaît lorsque je dois remplacer les lignes, qui contiennent des occurrences variables de 4 chiffres, séparés par une virgule et un espace.

La sortie de la première ligne devrait donc ressembler à ceci :

[1234] 0663 + [1234] 0667 + [1234] 0673 + [1234] 0677 + [1234] 0693 + [1234] 0697 + [1234] 0703 + [1234] 0707

De la deuxième ligne :

[1234] 0663 + [1234] 0667 + [1234] 0673 + [1234] 0677 + [1234] 0693

Et ainsi de suite.

En gros, toutes les occurrences des caractères à quatre chiffres doivent être remplacées par :

[1234] xxxx

("[1234]" est une chaîne constante) (x représente un chiffre)

et le

, 

(espace virgule)

doit être remplacé par

+

(signe plus)

Par conséquent, il ne doit pas avoir le signe + ni au début ni à la fin de la ligne, d'où la raison pour laquelle, les quatre chiffres sont traités séparément du ", " (espace virgule).

Normalement, je ferais le modèle de remplacement comme :

[1234] \1

Mais cela mettra [1234] et le dernier motif sauvegardé, donc dans le cas de la première ligne, il serait remplacé par :

[1234] 0707

De même, la partie ", " (espace virgule) doit toujours être remplacée par le signe plus.

2voto

Wiktor Stribiżew Points 100073

Utilisez un \G basée sur une regex avec un modèle de remplacement conditionnel :

Trouver quoi : (?:\G,\h*|^sum\(\{foo,\h*c\[)(\d{4})(\]\}\))?
Remplacer par : (?{2}[1234] $1:[1234] $1 + )

Note : Si le ]}) doit apparaître à la fin de la ligne, ajoutez $ - (\]\}\)$)?

enter image description here

Détails :

  • (?:\G,\h*|^sum\(\{foo,\h*c\[) - l'un ou l'autre sum({foo, c[ au début d'une chaîne ou d'une ligne (cf. ^sum\(\{foo,\h*c\[ ) ou la fin de la correspondance précédente réussie avec un , et 0+ espaces blancs horizontaux (voir \G,\h* )
  • (\d{4}) - Groupe 4 : exactement quatre chiffres
  • (\]\}\))? - un groupe 2 facultatif : une séquence de ]}) une ou zéro fois

Le modèle de remplacement :

  • (?{2} - ( début du modèle de remplacement conditionnel ) Si le groupe 2 correspond :
    • [1234] $1 - littéral [1234] et la valeur du groupe 1
    • : - autre
    • [1234] $1 + - littéral [1234] la sous-chaîne, la valeur du groupe 1 et une + séquence de caractères littéraux
  • ) - la fin du remplacement conditionnel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X