J'ai des lignes qui ressemblent à ceci:
- test 1 test test test test test test test test test - test2 - test3 test test t test test test - test 4 test test test - test5
Je recherche une expression rationnelle pour les convertir en ceci:
- test 1 test test test test test test test test test - test2 - test3 test test t test test test - test 4 test test test - test5
Cela consiste à supprimer toute nouvelle ligne après chaque ligne qui ne commence pas par \ s *? \ - et qui ne précède pas une ligne commençant par \ s *? \ -
3 Réponses :
Vous pouvez utiliser cette expression régulière en Perl / PCRE / Java, etc.:
Rechercher une expression régulière:
"$1$2 "
Remplacement:
(^-[^\n]*\n\h+|(?!^)\G)([^\n]*)\n(?!-)\h+
(^ - [^ \ n] * \ n \ h + | (?! ^) \ G) : Groupe n ° 1 pour capturer une ligne commençant par - jusqu'au caractère de fin de ligne suivi d'un espace ou plus sur la ligne suivante. \ G affirme la position à la fin de la correspondance précédente ou au début de la chaîne pour la première correspondance. ([^ \ n] *) : correspond à une ligne de 0 caractère ou plus sans nouvelle ligne Capturez ceci dans le groupe n ° 2 \ n (?! -) : correspond à la nouvelle ligne si elle n'est pas suivie de - \ h + : correspond à 1+ espaces blancs horizontaux Cela fonctionne sur la démo mais cela ne fonctionne pas ici: regex101.com/r/bm4094/2 a>
Que diriez-vous de quelque chose comme
^(\h*[^-\s].*)\R(?!-)
et remplacer par $1
^ correspond au début de la ligne (\ h * [^ - \ s]. *) d'abord group captures: toute quantité d'espace h suivi d'un caractère, c'est-à-dire pas - ou \ s d'espaces blancs, suivis d'un nombre quelconque de caractères \ R (?! -) séquence de retour à la ligne non suivie par un trait d'union Pour joindre des pièces par un seul espace voir cette version et la remplacer par $ 1 code > (un peu moins efficace).
++ C'est intelligent mais cela fusionnera également 2 lignes sans lignes d'en-tête, par exemple "..foo \ n..bar \ n" (remplacez . par un espace)
@anubhava right, dépend de l'entrée. se basait sur l'entrée d'échantillon =)
perl -ne 'if (/^-/) {
if ($buffer) {
print " $buffer";
print "\n" if /^-/;
}
print;
$buffer = "";
} else {
chomp;
$buffer .= s/^ +/ /r;
}
END { print " $buffer\n" if $buffer }'
Quelle est votre saveur / outil regex?
Je suis assez bon avec perl comme ... J'utilise de toute façon regex101.com .