J'ai des données qui ressemblent à ceci
john, dave, chris
rick, sam, bob
joe, milt, paul
J'utilise cette expression régulière pour faire correspondre les noms
/(\w.+?)(\r\n|\n|,)/
qui travaille pour la plupart , mais les extrémités de fichiers brusquement après le dernier mot qui signifie la dernière valeur ne se termine pas \r\n
, \n
ou ,
il se termine par EOF. Existe-t-il un moyen de faire correspondre EOF dans regex afin que je puisse le mettre correctement dans ce deuxième groupe?
Réponses:
La réponse à cette question
\Z
m'a pris un certain temps à comprendre, mais cela fonctionne maintenant. Notez qu'à l'inverse,\A
correspond au début de la chaîne entière (par opposition au début d'une ligne^
et$
correspond au début d'une ligne).la source
(\s*)\?>(\s*)\Z
... et après quelques recherches supplémentaires, voici ce qui fonctionnerait sur un dossier de projet :(\s*)\?>(\s*)(\n*)(\W)\Z
FYI: il s'agit de remplacer toutes les balises php de fermeture par des sauts de ligne à la fin du fichier.\A
fonctionne également dans Visual Studio find and replace. Comme toujours, utilisez de telles choses avec prudence, mais cela m'a évité une tonne de problèmes manuels une fois que j'étais heureux de faire la bonne chose.Scanner
classe de Java pour lire un fichier entier à la fois; si j'utilise\Z
comme délimiteur, le caractère de nouvelle ligne de fin est coupé. Lorsque j'ai changé le délimiteur en\z
, le caractère de nouvelle ligne de fin est conservé. Il semble que la réponse de Martin Dorey s'applique également à Java.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
correspond au début et à la fin de la chaîne, en ignorant totalement les sauts de ligne.Les extensions GNU aux expressions régulières POSIX utilisent
\`
et\'
pour les mêmes choses.la source
Dans Visual Studio, vous pouvez trouver EOF comme ceci:
$(?![\r\n])
. Cela fonctionne que vos fins de ligne soient CR, CRLF ou simplement LF.En prime, vous pouvez vous assurer que tous vos fichiers de code ont un marqueur de nouvelle ligne final comme ceci:
Comment ça marche:
Trouvez toute fin de ligne (une correspondance de largeur nulle) qui n'est pas précédée de CR ou LF et qui n'est pas non plus suivie de CR ou LF. Une réflexion 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.
la source
Comparez le comportement du \ Z suggéré par Ryan avec \ z:
perlre sez:
Une traduction du cas de test en Ruby (1.8.7, 1.9.2) se comporte de la même manière.
la source
Devez-vous vraiment capturer les séparateurs de ligne? Sinon, cette regex devrait être tout ce dont vous avez besoin:
Cela suppose que toutes les sous-chaînes que vous souhaitez mettre en correspondance sont entièrement constituées de caractères de mots, comme dans votre exemple.
la source
Peut-être essayer $ (EOL / EOF) au lieu de (\ r \ n | \ n)?
la source
Récemment, je cherchais quelque chose comme ça, mais pour JavaScript.
Mettre ceci ici, afin que toute personne ayant le même problème puisse en bénéficier
Fondamentalement, cela correspondrait à la fin de la ligne, qui n'est pas suivie d'un retour chariot ou de caractères de nouvelle ligne. En gros, c'est la même chose que
\Z
pour JavaScript.la source
En supposant que vous utilisiez le bon modificateur forçant à traiter la chaîne comme un tout (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 |, | $)
la source
/(\w.+?)(\r\n|\n|,|$)/
la source