1
votes

Regexp - joindre plusieurs lignes ne commençant pas par un tiret

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 *? \ -


2 commentaires

Quelle est votre saveur / outil regex?


Je suis assez bon avec perl comme ... J'utilise de toute façon regex101.com .


3 Réponses :


3
votes

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


1 commentaires

Cela fonctionne sur la démo mais cela ne fonctionne pas ici: regex101.com/r/bm4094/2



3
votes

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

Voir cette démo sur regex101

Pour joindre des pièces par un seul espace voir cette version et la remplacer par $ 1 code > (un peu moins efficace).


2 commentaires

++ 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 =)



0
votes
perl -ne 'if (/^-/) {
              if ($buffer) {
                  print " $buffer";
                  print "\n" if /^-/;
              }
              print;
              $buffer = "";
          } else {
              chomp;
              $buffer .= s/^ +/ /r;
          }
          END { print " $buffer\n" if $buffer }'

0 commentaires