112 votes

regex pour correspondre à EOF

J'ai des données qui ressemblent à ceci

 john, dave, chris
rick, sam, bob
joe, milt, paul
 

J'utilise cette regex pour faire correspondre les noms

 /(\w.+?)(\r\n|\n|,)/
 

qui fonctionne pour la plupart mais le fichier se termine brusquement après le dernier mot, ce qui signifie que la dernière valeur ne se termine pas par \r\n , \n ou , EOF. Y at-il un moyen de faire correspondre EOF dans regex afin que je puisse le corriger dans ce deuxième groupe?

191voto

Ryan Points 1525

La réponse à cette question est \Z m'a pris un peu de temps pour le comprendre, mais cela fonctionne maintenant. Notez qu'à l'inverse, \A correspond au début de la chaîne entière (par opposition à ^ et $ correspondant au début d'une ligne).

29voto

paxdiablo Points 341644

EOF n'est pas réellement un personnage. Si vous avez une chaîne multiligne, alors '$' correspondra à la fin de la chaîne ainsi qu'à la fin d'une ligne.

En Perl et ses frères, \A et \Z correspondent au début et à la fin de la chaîne, ignorant totalement les sauts de ligne.

Les extensions GNU aux expressions rationnelles POSIX utilisent \` et \' pour les mêmes choses.

11voto

user18096 Points 1277

Le contraste le comportement de Ryan suggéré \Z \z:

$ perl -nous " mon $corpus = "bonjour\n"; $corpus =~ s/\Z/monde/g; print(":$corpus:\n")'
:helloworld
monde:
$ perl -nous " mon $corpus = "bonjour\n"; $corpus =~ s/\z/monde/g; print(":$corpus:\n")'
:bonjour
monde:
$ 

perlre sez:

\Z correspond seulement à la fin de la chaîne, ou avant de saut de ligne à la fin
\z correspond seulement à la fin de la chaîne

Une traduction du cas de test en Ruby (1.8.7, 1.9.2) se comporte de la même.

3voto

Alan Moore Points 39365

Devez-vous vraiment capturer les séparateurs de lignes? Sinon, cette regex devrait être tout ce dont vous avez besoin:

 /\w+/
 

En supposant que toutes les sous-chaînes auxquelles vous voulez faire correspondre soient entièrement composées de caractères de mots, comme dans votre exemple.

1voto

leafnode Points 1047

En supposant que vous utilisez le modificateur approprié pour traiter la chaîne dans son ensemble (pas ligne par ligne - et si \ n fonctionne pour vous, vous l'utilisez), ajoutez simplement une autre alternative - fin de chaîne: (\ r \ n | \ n |, | $)

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