Rechercher/remplacer regex

Résolu/Fermé
arconobo Messages postés 33 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 25 avril 2023 - 6 oct. 2010 à 18:32
arconobo Messages postés 33 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 25 avril 2023 - 7 oct. 2010 à 19:08
Bonjour,

J'ai un gros fichier html avec des balises dans le désordre.
J'aurai voulu utiliser les expressions régulières pour le réordonner mais je n'y arrive pas. Soit parce que je n'utilise pas le bon logiciel, soit parce que je ne tape pas la bonne expression.

Par exemple :
<div>
<span>du texte</span>
<span class="bla">du texte</span>
<span>du texte</span>
</div>
<div>
<span>du texte</span>
<span>du texte</span>
<span class="bla">du texte</span>
</div>

si je veux faire remonter en première position toutes les spans qui on une class "bla" je me suis dit qu'il fait faire
rechercher:
<div>(.*)<span class="bla">(.*)</span>(.*)</div>
et remplacer par :
<div><span class="bla">$2</span>$1$3</div>

mais ça ne fonctionne pas.

Quel editeur de texte serait capable de me faire ça et quelle et l'expression pour y arriver ?

6 réponses

Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
6 oct. 2010 à 19:15
Salut,
le problème c'est que l'étoile est avare (« greedy star ») et va aller le plus loin possible avant de s'arrêter. Ça va capturer trop de <span>.

Une solution simple, c'est d'utiliser l'étoile paresseuse (« lazy star ») :
(.*?)

Elle s'arrête le plus tôt possible.

Par contre, cette solution n'est pas optimale car le moteur de regexp est souvent forcé de revenir en arrière... Mais c'est la plus simple à mettre en oeuvre.

;)
1
arconobo Messages postés 33 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 25 avril 2023 7
6 oct. 2010 à 19:59
Merci pour cette précision.
C'est vrai que ça m'arrivait souvent qu'il capture quasiment tout le texte. Mais je voulais savoir comment faire pour que ce "(.*?)" capture aussi les saut de ligne ?

J'ai trouvé une solution qui fonctionne mais je pense pas que ce soit la meilleure :

<div>
([^}]*?)<span class="bla">(.*?)</span>
([^}]*?)</div>

je met une accolade parce que je suis presque sur qu'il n'y en a pas dans mon texte et comme ça il ne s'arrête pas au premier saut de ligne.

Il n'y a pas un moyen pour exprimer TOUT (saut de ligne, tab....) jusqu'au premier <span class="bla"> ?
0
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
7 oct. 2010 à 10:44
Ça dépend du langage que tu utilises. En PHP avec PCRE (mais pas POSIX), on peut activer l'option dotall (s), qui force le point à matcher les sauts de ligne. En JavaScript c'est impossible.

Voici la syntaxe :
/(.*?)/s


( https://www.php.net/manual/fr/reference.pcre.pattern.modifiers.php )

Java et les langages .NET ont également adopté le moteur PCRE.

;)
0
arconobo Messages postés 33 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 25 avril 2023 7
7 oct. 2010 à 11:06
euh je ne sais pas quel langage j'utilise... C'est pour faire des rechercher/remplacer (pour les expression régulières j'utilise jEdit pour le reste notepad++, j'ai pas encore trouvé l'éditeur qui fait tout ce que je veux)

la syntaxe que tu m'a donné ne fonctionne pas avec jEdit.

c'est bien compliqué c'est expressions régulières qui change selon le langage et le soft...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
Modifié par Groarh le 7/10/2010 à 16:00
Je sais que c'est une des lacunes de Notepad++. Pour jEdit, je ne le connais pas mais s'il est bien foutu tu devrais avoir un moyen d'activer le mode dotall (par exemple une case à cocher).

Sinon bah, y'a pas moyen :|
0
arconobo Messages postés 33 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 25 avril 2023 7
7 oct. 2010 à 19:08
Je croyais que pour activer le mode dotall il fait chercher dans le menu de jedit ou installer un plugin :D

J'ai trouvé ça :
(?s)<div>(.*?)<span class="bla">(.*?)</span>(.*?)</div>

et ça fonctionne.
merci.
0