Struggle to match multiple same occurence after one specific character chain REGEX

Thanks to anyone that will try to help me.
I struggle into making a regex that can do this case :
I want every match of "Heure Pleine Saison Basse" that occur after the first occurence of "Acheminement conso".

Using the raw text below, i want to match "Heure Pleine Saison Basse" 3 4 5 6 7 and not 1 & 2.
Do not use the number inside characted recognition, it is just here to help you uderstand which chain i want to match

This example regex only match the last occurrence :

Acheminement[\s\S]*(Heure Pleine Saison Basse)

Here is a great raw text example :

Electricité n° de\n
compteur ancien\n
index nouvel\n
index conso\n
kWh/Qté prix unitaire\n
HT en euros montant HT\n
en euros taux de\n
Contribution cee du 14/07/22 au 13/08/22 143020,00495 70,7920,0%\n
Evolutions arenh du 14/07/22 au 13/08/22 14302-0,03149 -450,3720,0%\n
Consommation  du 14/07/22 au 13/08/22 154\n
Heure Pleine Saison Basse 1
Heure Pleine Saison Basse 2
Heure Creuse Saison Basse 2
Acheminement conso\n
kWh/Qté prix unitaire\n
HT en euros montant HT\n
en euros taux de\n
Composante de comptage du 1
Composante de comptage du 2
Composante de soutirage du 1
Composante de soutirage du 2
Composante de gestion 1
Composante de gestion 2
Consommation du 14/07/22 au 31/07/22 Heure Pleine Saison Basse 56200,02000 112,4020,0%\n
Heure Creuse Saison Basse 26840,01700 45,6320,0%\n
Consommation du 01/08/22 au 13/08/22\n
Heure Pleine Saison Basse 3
Heure Creuse Saison Basse 4
Heure Pleine Saison Basse 5
Heure Pleine Saison Basse 6
Heure Pleine Saison Basse 7
Services et prestations techniques conso\n
kWh/Qté prix unitaire\n
HT en euros montant HT\n
en euros taux de\n
Espace Client Gratuit\n
Taxes et Contributions conso\n

>Solution :

You can use

'/(?:\G(?!\A)|Acheminement conso)[\s\S]*?\KHeure Pleine Saison Basse/u'
'/(?:\G(?!\A)|Acheminement conso).*?\KHeure Pleine Saison Basse/su'

See the regex demo. Details:

  • (?:\G(?!\A)|Acheminement conso) – either Acheminement conso or the end of the previous match (\G(?!\A) is matching what \G operator matches except the position at the start of string that is "cancelled" with the (?!\A) negative lookahead)
  • [\s\S]*? – any zero or more chars as few as possible
  • \Komit the text matched so far
  • Heure Pleine Saison Basse – a fixed string.

The u flag is necessary when you have to deal with Unicode strings.
The s flag is useful to make . match any characters including line breaks.

Leave a Reply