Rechercher/remplacer regex
Résolu
arconobo
Messages postés
33
Statut
Membre
-
arconobo Messages postés 33 Statut Membre -
arconobo Messages postés 33 Statut Membre -
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 ?
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:
- Rechercher/remplacer regex
- Rechercher remplacer word - Guide
- Remplacer disque dur par ssd - Guide
- Rechercher ou entrer l'adresse - Guide
- Rechercher image - Guide
- Remplacer coco - Accueil - Réseaux sociaux
6 réponses
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.
;)
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.
;)
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"> ?
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"> ?
Ç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 :
( https://www.php.net/manual/fr/reference.pcre.pattern.modifiers.php )
Java et les langages .NET ont également adopté le moteur PCRE.
;)
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.
;)
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...
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...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question