2 votes

Regex PCRE - comment capturer le premier match des lignes au-dessus du motif?

J'ai le texte suivant dans un fichier :

mysql_databases:
  potato_mychat1:
    - potato_mychat1
  potato_phpb1:
    - potato_phpb1
    - potato_smf1
  potato_phpb2:
    - potato_phpb2
  p_phpb282:
    - potato_phpb282
  potato_registry:
    - potato_registryadmi
  potato_smf1:
    - potato_smf1
  potato_smf2:
    - potato_smf2
  potato_wp82:
    - potato_wp82

Le motif serait - potato_smf1.

La première chaîne se terminant par : au-dessus de chaque correspondance devrait être marquée - donc dans ce cas potato_phpb1: et potato_smf1:.

J'ai essayé de nombreuses variations de positive lookbehind : (?<= - potato_smf)*: mais je n'y arrive pas quoi que je fasse, je vous serais reconnaissant de tout indice.

1voto

Wiktor Stribiżew Points 100073

En supposant que vous puissiez vous fier à l'indentation, vous pouvez utiliser

(?m)^\h{2}\S.*(?=(?:\R\h{4}.*)*?\R\h{4}- potato_smf1)

Consultez la démonstration regex

Détails

  • (?m)^ - début d'une ligne
  • \h{2} - deux espaces horizontaux
  • \S.* - un caractère autre qu'un espace puis 0 ou plusieurs caractères autres que des caractères de saut de ligne, autant que possible
  • (?=(?:\R\h{4}.*)*?\R\h{4}- potato_smf1) - une recherche en avant positive qui exige, immédiatement sur la droite,
    • (?:\R\h{4}.*)*? - zéro ou plusieurs, mais le moins possible, répétitions d'un saut de ligne, quatre espaces horizontaux et ensuite zéro ou plusieurs caractères autres que des caractères de saut de ligne, autant que possible
    • \R - un saut de ligne
    • \h{4} - quatre espaces horizontaux
    • - potato_smf1 - un texte littéral.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X