J'ai téléchargé des fichiers via FTP et il a ajouté des nouvelles lignes après chaque ligne. Maintenant, dans mon code, j'avais des lignes vides ajoutées pour le contexte. Après le téléchargement, chaque ligne vide que j'ai ajoutée contient maintenant trois lignes vides.
Donc, si je supprime toutes les lignes vides avec une expression regex comme celle-ci ^ \ n , cela supprime également les lignes que j'ai ajoutées pour le contexte. Et ce ^ \ n {1} n'aide pas non plus.
Voici un exemple de HTML que j'ai maintenant après l'avoir téléchargé via FTP:
<nav>
<ul>
<li><a href="#">London</a></li>
<li><a href="#">Paris</a></li>
<li><a href="#">Tokyo</a></li>
</ul>
</nav>
<div>new context</div>
<div>new context</div>
Voici à quoi je voudrais que cela ressemble:
<nav>
<ul>
<li><a href="#">London</a></li>
<li><a href="#">Paris</a></li>
<li><a href="#">Tokyo</a></li>
</ul>
</nav>
<div>new context</div>
<div>new context</div>
Fondamentalement, j'ai besoin d'une expression regex qui trouverait toutes les lignes vides qui ne sont pas après ou avant une autre ligne vide.
5 Réponses :
Ce que vous pouvez faire est de faire correspondre une seule ligne où il y a au moins un caractère non blanc. Faites ensuite correspondre la ligne vide suivante suivie d'une nouvelle ligne. Cela prendra également en compte si les lignes vides contiennent elles-mêmes des espaces.
Ensuite, utilisez une anticipation positive pour affirmer que sur la ligne suivante il y a un caractère non blanc présent.
Remplacez ces correspondances par la première groupe de capture $1
^([ \t]*\S.*\n)[ \t]*$\n(?=[ \t]*\S)
Cela correspondra
^ Début de chaîne ( Groupe de capture
[\ t] * \ S. * \ n Correspond à 0 fois un espace ou une tabulation, puis un caractère sans espace suivi de la correspondance jusqu'à la fin de la chaîne et une nouvelle ligne li >
) Fermer le groupe [\ t] * $ \ n Faire correspondre une ligne vide ou uniquement des espaces ou des tabulations (? = Lookahead positif, affirmer ce qui suit
[\ t] * \ S) Correspond à 0 fois un espace ou une tabulation suivi d'un caractère non blanc ) Fermer lookahead Essayez quelque chose comme ceci:
(?<!\n)\n(?!\n$)
avec les options g et m et remplacez-les par une chaîne vide.
Pour un exemple fonctionnel, voir https://regex101.com/r/uEpQ0L/1
comment utiliser les options g et m dans VS Code?
Recherchez le Weg. Par exemple, docs.microsoft.com/en-us / dotnet / standard / base-types /…
Je ne connais pas la configuration exacte pour VS Code mais g signifie global et m signifie multiligne. Voici une ressource pour au moins multiligne: stackoverflow.com/questions/41150941/...
La fonctionnalité de regard négatif derrière n'est pas prise en charge dans tous les navigateurs. Je ne pense pas qu'il soit pris en charge dans VS Code, car il renvoie une erreur.
@saritonin Après recherche, je pense que c'est la valeur par défaut lors de l'utilisation de \ n dans une regex. Comme vu ici pour plusieurs lignes: stackoverflow.com/questions/52647894/...
Vérifiez code.visualstudio.com/updates/v1_29#_multiline-search J'ai trouvé il y a une description concernant la multiligne et lookbehind / lookahead.
En regardant plus loin, j'ai trouvé que l'assertion lookbehind a été mise à jour dans la dernière version 1.32. Il manquait dans les notes de publication comme indiqué ici: github.com/Microsoft/vscode/issues/68004
Après la mise à jour vers la dernière version, je n'obtiens pas d'erreur non valide lors de l'insertion de l'expression régulière ci-dessus dans le champ de recherche. Seulement cela ne me donne pas le résultat escompté. Après un peu de jeu, cela fonctionne pour moi: (?
EDIT:
Après avoir vu Valdi_Bo answer cela semblait être une très bonne solution. Le seul problème est que cela ne fonctionne pas correctement dans VS Code. Donc, pour que cela fonctionne dans VS Code, vous devez être mis à jour vers la version 1.32 et changer l'expression régulière en:
<nav>
<ul>
<li><a href="#">London</a></li>
<li><a href="#">Paris</a></li>
<li><a href="#">Tokyo</a></li>
</ul>
</nav>
<div>new context</div>
<div>new context</div>
et ensuite j'ai obtenu le résultat souhaité comme vu ici: https://regex101.com/r/b3Jnk2/1
Réponse précédente:
Cette regex l'a fait pour moi.
^ (\ n) (?! \ n {2}) code>
Voici le résultat que j'ai obtenu:
(?<!^\n)^\n(?!\n$)
Après avoir fait cela, il vous reste encore quelques lignes vides dont vous voulez vous débarrasser mais pas les lignes vides qui ont été ajoutées pour le contexte, utilisez cette regex:
^(\n{2})
Cela peut être très utile lorsque les fichiers téléchargés à partir de ftp sont corrompus. La meilleure chose à faire est de s'assurer que cela ne se produira pas la prochaine fois, voir - superuser.com/questions/1091022/...
Dans vscode, lorsque vous appuyez sur Ctrl + F activez regex et insérez ce qui suit dans le champ Rechercher :
>\n
Il a supprimé toutes les balises de fermeture de toutes les extrémités des lignes.
Vous n’avez pas oublié le > \ n dans la boîte de remplacement? Pour moi, cela fonctionne comme prévu dans vscode 1.32.3
Ah, mon erreur, j'ai manqué cette> balise de fermeture du champ de remplacement.
Cela fonctionne pour trouver une seule ligne vide
Rechercher: (\ S [^ \ S \ n] * \ n) [^ \ S \ n] * \ n (?! [^ \ S \ n] * \ n)
Remplacez: $1
https://regex101.com / r / 7IbV1Y / 1
Expliqué
( \S [^\S\n]* \n ) # (1) A line with a piece of non-wsp text [^\S\n]* \n # Single blank line with a line break (?! [^\S\n]* \n ) # Not a blank line with a line break ahead
Ah, maintenant ça marche! Je ne pensais pas que la dernière mise à jour était si importante.
Fonctionne également sur les lignes comportant des espaces. Si vous voulez que cela fonctionne uniquement sur des lignes sans espaces, regardez ma réponse. stackoverflow.com/a/55382979/10060799