Rechercher/remplacer regex

Résolu
arconobo Messages postés 33 Date d'inscription   Statut Membre Dernière intervention   -  
arconobo Messages postés 33 Date d'inscription   Statut Membre Dernière intervention   -
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 ?
A voir également:

6 réponses

Groarh Messages postés 682 Date d'inscription   Statut Membre Dernière intervention   185
 
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   Statut Membre Dernière intervention   7
 
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   Statut Membre Dernière intervention   185
 
Ç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   Statut Membre Dernière intervention   7
 
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   Statut Membre Dernière intervention   185
 
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   Statut Membre Dernière intervention   7
 
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