2011-04-05 05:57:20 +0000 2011-04-05 05:57:20 +0000
45
45
Advertisement

Ne correspondant qu'à la première occurrence dans une ligne avec Regex

Advertisement

Je suis complètement nouveau à la regex et j'apprécierais beaucoup 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 intactes, pour chaque ligne. Existe-t-il une expression regex qui ne correspondrait qu'à la première virgule ?

J'ai essayé ceci : ^.....,. Elle correspond à la virgule, mais aussi à toute la longueur de la chaîne précédant la virgule, donc si j'essaie de la remplacer par un espace, tous les nombres sont également supprimés.

Advertisement
Advertisement

Réponses (6)

55
55
55
2011-04-05 06:26:54 +0000

Le modèle d'appariement pourrait être :

^([^,]+),

Cela signifie que

^ 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 perl par exemple, l'ensemble de l'appariement et du remplacement ressemblerait à :

s/^([^,]+),/ /

La pièce de rechange prend simplement l'ensemble qui a été appariée et le remplace par le premier bloc dont vous vous êtes souvenu et ajoute un espace. La coma est “abandonnée” parce qu'elle n'est pas dans le premier groupe de capture.

7
7
7
2012-08-01 21:31:36 +0000
s/,/ /

Ceci, par défaut (c'est-à-dire sans l'option g), ne remplace que la première correspondance.

3
Advertisement
3
3
2011-04-05 06:26:08 +0000
Advertisement

Il ne doit correspondre qu'au premier chiffre et à la virgule : ^(\d{5}),. Si vous voulez engloutir tout le reste de la ligne, changez la regex en ceci : ^(\d{5}),(.*)$

2
2
2
2015-05-13 00:44:34 +0000

Une solution plus élégante consiste à utiliser la correspondance paresseuse :

s/^(.+?),/ /

qui regroupera les caractères en allant du début de la chaîne (^) vers la fin par un caractère (.+?) à chaque étape jusqu'à ce qu'elle trouve le premier signe de virgule. Tout ce groupe ainsi que la première occurrence de la virgule seront remplacés par le groupe (“) et le caractère espace.

1
Advertisement
1
1
2015-02-28 21:07:59 +0000
Advertisement

Le TextPad a toujours eu la possibilité d'utiliser la notation posix, mais vous devez modifier les paramètres dans une autre boîte de dialogue. Pour utiliser les paramètres par défaut du TextPad pour les expressions régulières, vous devez “échapper” les parenthèses ouvrantes et fermantes :

Remplacez l'espace après le code postal à 5 chiffres, au début de chaque ligne

^\([0-9]+\)[]

Avec tabulation

\t

Comme ci-dessus, le ^ signifie le début de la ligne

( est une “parenthèse échappée” et elle 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 d'espacement (vous pourriez omettre les parenthèses, mais alors personne ne pourrait 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

Donc la commande de recherche et de remplacement recherche un ou plusieurs chiffres, suivis d'un espace. Elle remplace ensuite tout cela par le même groupe de chiffres suivi d'une tabulation.

Je ne pense pas qu'il soit possible de trouver simplement “un espace qui vient après 5 chiffres”, donc vous pouvez simplement remplacer l'espace sans toucher aux chiffres. Vous devez trouver les 5 chiffres (la première chaîne) suivis par l'espace (la deuxième chaîne). Ensuite, bien que cela semble redondant ou encombrant, REMPLACER la chaîne originale de 5 chiffres par ITSELF, suivie de la tabulation (la deuxième chaîne).

Tous ceux qui connaissent cela oublient que les débutants n'en ont aucune idée. C'est pourquoi je vous l'explique, mon ami.

Ed Poor Math Tutor and retired Computer Programmer New York City

0
0
0
2019-11-26 19:24:16 +0000

Pour ne correspondre qu'à la première occurrence d'une expression regex, il faut supprimer tous les drapeaux. Chaque expression regex est accompagnée des drapeaux possibles suivants et utilise par défaut le drapeau global qui correspondra à plus d'une occurrence :

  • /g = Avec ce drapeau, la recherche cherche toutes les occurrences, sans lui - seule la première occurrence est renvoyée
  • /i = insensible à la casse
  • /m = mode multi-lignes
  • /s = tous . pour correspondre au caractère newline \n
  • /u = unicode
  • /y = mode collant (recherche dans un endroit spécifique)
Advertisement

Questions connexes

3
3
12
4
5
Advertisement
Advertisement