Je suis complètement nouveau pour regex et j'apprécierais grandement toute aide.
La tâche est simple. J'ai un fichier CSV avec des enregistrements qui se lisent comme ceci:
12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890
Je voudrais remplacer la première virgule par un espace et laisser le reste des virgules intact, pour chaque ligne. Existe-t-il une expression regex qui ne correspond à la première virgule?
J'ai essayé ceci: ^.....,
. Cela correspond à la virgule, cependant, il correspond également à toute la longueur de la chaîne précédant la virgule, donc si j'essaie de le remplacer par un espace tous les nombres sont également supprimés.
Le motif correspondant pourrait être:
^([^,]+),
Cela signifie
^ starts with
[^,] anything but a comma
+ repeated one or more times (use * (means zero or more) if the first field can be empty)
([^,]+) remember that part
, followed by a comma
Dans par exemple Perl, tout le match et le remplacement ressemblerait à ceci:
s/^([^,]+),/\1 /
La pièce de remplacement prend simplement tout ce qui correspond et le remplace par le premier bloc mémorisé et ajoute un espace. Le coma est "supprimé" car il ne fait pas partie du premier groupe de capture.
s/,/ /
Ceci, par défaut (c'est-à-dire sans l'option g
), ne remplace que la première correspondance.
Une solution plus élégante consiste à utiliser la correspondance paresseuse:
s/^(.+?),/\1 /
cela regroupera les caractères en déplaçant le début de la chaîne (^
) vers la fin par un caractère (.+?
) à chaque étape jusqu'à ce qu'il trouve la première virgule. Tout ce groupe avec la première occurrence de virgule sera remplacé par le groupe (\1
) et le caractère espace.
Cela doit correspondre uniquement au premier nombre et à la virgule: ^(\d{5}),
. Si vous souhaitez engloutir tout le reste de la ligne, remplacez l'expression régulière par ceci: ^(\d{5}),(.*)$
TextPad a toujours eu la possibilité d'utiliser la notation posix, mais vous devez modifier les paramètres dans une boîte de dialogue différente. Pour utiliser les paramètres par défaut de TextPad pour les expressions régulières, vous devez "échapper" entre les parenthèses ouvrantes et fermantes:
Remplacer l'espace après le code postal à 5 chiffres, au début de chaque ligne
^\([0-9]+\)[ ]
Avec onglet
\1\t
Comme ci-dessus, le ^ signifie début de ligne
\ (est une "parenthèse échappée" et marque le début de la première expression de recherche, c’est-à-dire les cinq chiffres
[0-9] + signifie un ou plusieurs chiffres (pas seulement les codes postaux à 5 chiffres)
\) est une autre "parenthèse échappée" pour marquer la fin de la première expression de recherche
[] est juste un caractère espace (vous pouvez omettre les crochets, mais personne ne pourra le voir sur cette page Web :-)
Dans l'expression de remplacement
\ 1 est la première expression de recherche, la partie entre parenthèses ci-dessus (un ou plusieurs chiffres)
\ t est un caractère de tabulation
La commande search and replace recherche donc un ou plusieurs chiffres, suivis d'un espace. Ensuite, tout cela est remplacé par le même groupe de chiffres suivi d'un onglet.
Je ne pense pas qu'il soit possible de trouver simplement "un espace après 5 chiffres" afin de pouvoir simplement remplacer cet espace sans toucher aux chiffres. Vous devez trouver les 5 chiffres (la première chaîne) suivis de l’espace (la deuxième chaîne). Ensuite, bien que cela semble redondant ou fastidieux, REMPLACEZ la chaîne originale de 5 chiffres par ITSELF, suivie de la tabulation (la deuxième chaîne).
Tous ceux qui le savent oublient que les débutants n’en ont aucune idée. C'est pourquoi je vous l'explique, mon ami.
Ed Poor Math Tutor et programmeur à la retraite, New York City