Pour répondre à ton poste 11h45 sur le synopsys.
ton erreur se situe sur le (.*)?
(.*)? Signifie capture n'importe quel caractère de 0 a n fois, sachant qu'il capturera le max possible, et le ? a l'extérieur des parenthèses est vu comme un quantificateur signifiant 0 ou 1. En gros, il n'a aucune incidence puisque le quantificateur interne (l'étoile) couvre la même plage.
Ce que tu voulais faire, c'est plus probablement (.*?), ou tu captures la plus petite chaîne possible.
Concernant la remarque de Berzemus, le . match effectivement tous les caractère sauf le newline (soit \n et/ou \r). Si tu veux matcher le newline, le plus simple est encore d'ajouter le modificateur m (pour multiple line).
Enfin, moi perso, je trouve plus simple et plus lisible /(.*)/m que /([\s\S]*)/ même si au final, cela revient au même. Ce qu'il faut savoir, c'est qu'il y a souvent beaucoup de solution qui aboutissent au même résultat en regexp.
Duand tu as une classe de base type \d, \D signifie la négation de cette classe de base. Pour \s, c'est la meme chose \S match tout ce qui n'est pas matché par \s (espace, tab, CR LF). C'est aussi vrai pour l'assertions d'ancrage \b pour limite de mot et \B pour une non limite de mot.
La piste que te donne berzemus est la bonne. Il faut trouver une "ancre" qui te permet d'identifier l'approche de la chaine que tu souhaites matcher, et ensuite, capturer uniquement par apport a cette ancre, la sous chaine qui t'interesse. En l'occurence, après le mots sysnopsis (ton ancre), tout ce qui se trouve entre les premiers h4 que tu rencontres.
Une autre syntaxe: