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 correspondre aux noms

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

ce 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 se termine par EOF. Y a-t-il un moyen de faire correspondre EOF dans l’expression rationnelle pour que je puisse le mettre correctement dans ce deuxième groupe?

La réponse à cette question est que \Z m’a pris du 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).

EOF n’est pas réellement un personnage. Si vous avez une chaîne multi-lignes, alors “$” correspondra à la fin de la chaîne ainsi qu’à la fin d’une ligne.

Dans 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 des expressions rationnelles POSIX utilisent \` et \' pour les mêmes choses.

Dans Visual Studio, vous pouvez trouver EOF comme suit: $(?![\r\n]) . Cela fonctionne si vos fins de ligne sont CR, CRLF, ou juste LF.

En bonus, vous pouvez vous assurer que tous vos fichiers de code ont un marqueur de nouvelle ligne comme celui-ci:

  Find What: (?< ![\r\n])$(?![\r\n]) Replace With: \r\n Use Regular Expressions: checked Look at these file types: *.cs, *.cshtml, *.js 

Comment ça marche:

Recherchez toute fin de ligne (une correspondance de largeur nulle) qui n'est pas précédée de CR ou de LF et qui n'est pas non plus suivie par CR ou LF. Une reflection vous montrera pourquoi cela fonctionne!

Notez que vous devez remplacer par le caractère de fin de ligne souhaité, que ce soit CR, LF ou CRLF.

Comparez le comportement de \ Z avec \ z suggéré par Ryan:

 $ perl -we 'my $ corpus = "hello \ n";  $ corpus = ~ s / \ Z / world / g;  print (": $ corpus: \ n") '
 :Bonjour le monde
 monde:
 $ perl -we 'my $ corpus = "hello \ n";  $ corpus = ~ s / \ z / world / g;  print (": $ corpus: \ n") '
 :Bonjour
 monde:
 $ 

perlre sez:

 \ Z Correspond uniquement à la fin de la chaîne ou avant le retour à la fin
 \ z Correspond uniquement à la fin de la chaîne

Une traduction du test élémentaire dans Ruby (1.8.7, 1.9.2) se comporte de la même manière.

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

 /\w+/ 

Cela suppose que toutes les sous-chaînes que vous souhaitez associer sont entièrement composées de mots, comme dans votre exemple.

Peut-être essayer $ (EOL / EOF) au lieu de (\ r \ n | \ n)?

 /\"(.+?)\".+?(\w.+?)$/ 

En supposant que vous utilisez un modificateur correct obligeant à 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 |, | $)

Récemment, je cherchais quelque chose comme ça, mais pour JavaScript.

Mettre cela ici, afin que toute personne ayant le même problème puisse en bénéficier

 var matchEndOfInput = /$(?![\r\n])/gm; 

Fondamentalement, cela correspond à la fin de la ligne, qui n’est pas suivie d’un retour chariot ou de nouveaux caractères de ligne. Essentiellement, c’est la même chose que \Z mais pour JavaScript.

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