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 .