Welcome Guest! To enable all features please Connexion ou Inscription.

Notification

Icon
Error

Options
Aller au dernier message Aller au dernier message non-lu
Offline Dalvyn  
#1 Envoyé le : dimanche 4 juillet 2010 18:05:50(UTC)
Dalvyn
Rang : Référent
Inscrit le : 15/12/2009(UTC)
Messages : 18,213
Note. Il existe plein de programmes pour éditer des textes. Personnellement, pour des textes simples (comme les pages du wiki), j'utilise Textpad 4.7.3 (disponible ici par exemple).

Qu'est-ce qu'une expression régulière ? Il y a plusieurs manières de répondre à la question, et il existe des définitions techniques très précises et très complexes. Mais, dans le cadre de ce post, une expression régulière, c'est une description générique d'un morceau de texte écrite sous une forme/un code bien spécifique ; c'est donc une description qui peut correspondre à plusieurs morceaux de texte. Ce n'est pas forcément plus clair alors, pour donner quelques exemples, voici quelques descriptions génériques :
— tous les mots de quatre lettres se terminant par ki (wiki, kaki, ...)
— les numéros de téléphone en Belgique : un préfixe commençant par 0 et suivi de deux chiffres, puis une barre oblique /, puis deux chiffres, un point, deux chiffres, un point, et enfin deux chiffres.
— le nom d'un monstre dans le code d'une page du bestiaire wiki : c'est la portion de texte qui se trouve entre {s:BDTitre| et la barre verticale | suivante.

Les expressions régulières sont souvent utilisées pour réaliser, sur un fichier de texte, des modifications plus ou moins génériques. En gros, ça revient à du "rechercher-remplacer" plus générique : dans un "rechercher-remplacer" simple, on va rechercher partout dans le texte une suite de caractères bien précises (un mot par exemple) et la remplacer chaque fois par une autre suite de caractères (un autre mot) ; dans un "rechercher-remplacer" basé sur les expressions régulières, on va faire la même chose, mais on ne recherchera plus une suite de caractères bien précise mais plutôt n'importe quelle chaîne de caractères qui correspond à l'expression régulière (au format) donné.

Dans la suite, j'utilise le format des expressions régulières employées par TextPad. D'autres programmes utilisent parfois des formats différents. Pour faire des rechercher/remplacer avec Textepad, il suffit d'appuyer sur F8. Ne pas oublier de cocher la case "Regular expressions" si vous en utilisez (sinon, il considère que ces sont des rechercher-remplacer simples).

Quelques éléments de base pour les expressions régulières. Encore faut-il savoir comment écrire une expression régulière. Pour ce faire, on utilise un certain nombre de symboles qui ont une signification bien précise, comme par exemple le point (.), qui signifie "n'importe quel caractère" ou encore l'étoile (*) qui signifie "zéro, une ou plusieurs fois". Les autres caractères, qui n'ont pas de signification particulière (c'est entre autre le cas de toutes les lettres et de tous les chiffres) se représentent eux-mêmes.

Par exemple :
— b.c est une expression régulière qui correspond à tous les morceaux de texte de trois caractères dont le premier est b et le dernier est c : bic, bac, buc, b7c, bbc, b-c, et b*c par exemple.
— b.*e est une expression régulière qui correspond à tous les morceaux de texte qui commencent par un b et se termine par un e (avec, entre les deux, zéro, un ou plusieurs caractères quelconques) : bue, ble et b3e par exemple,mais aussi be, barbecue, berbère, baraka de la chance, etc.

Jusqu'ici, on a parlé des premiers éléments pour écrire des expressions régulières pour la partie "rechercher", mais ce qu'on veut faire, c'est non seulement rechercher ces expressions mais les remplacer par autre chose. Et, parfois (souvent, en fait), cet "autre chose" dépend de l'expression régulière. Par exemple, on pourrait vouloir remplacer tous les passages "b.c" par "c.b" en invertissant b et c mais en gardant la lettre du milieu.

Pour ce faire, Textpad permet de garnir les expressions régulières avec des \( et des \) pour désigner des parties qu'on veut reproduire dans la suite. L'idée est la suivante : dans l'expression régulière à rechercher, on peut désigner plusieurs parties à l'aide de \( et de \) ; si on veut réemployer le contenu de ces parties dans l'expression "remplacer", on les désigne par \1 (pour la première), \2 (pour la seconde), \3, \4, et ainsi de suite.

Par exemple :
— Pour intervertir b et c dans tous les "b.c", on utilisera comme expression de recherche
Code :
b\(.\)c

et comme expression de remplacement
Code :
c\1b

Ici, on recherche "b.c" et on retient — c'est l'effet de \( et de )\ — la lettre du milieu. On remplace par "c\1b", où \1 est la première section retenue (la seule, dans ce cas-ci), c'est-à-dire la lettre du milieu.
— Pour mettre en italique tous les passages en gras d'une page wiki, on peut rechercher
Code :
'''\(.*\)'''

et remplacer par
Code :
''\1''

Ici, on recherche tous les bouts de textes — c'est la signification de .* : n'importe quelle suite de n'importe quels caractères — entourés par des triples apostrophes et les remplace par le même bout de texte (\1) encadré par des doubles guillemets. Notez que, pour ce faire, on aurait tout aussi bien pu faire un simple rechercher sur ''' et remplacer sur ''. Notez aussi qu'il faut être prudent avec les expressions régulières, parce qu'elles peuvent avoir des effets auxquels on n'aurait pas pensé dans certains cas particuliers : pensez par exemple à ce que cette opération ferait si on avait sur la page un passage en gras-italique : '''''gras et italique'''''

Un exemple pratique


Pour réécrire les exemples de compagnons animaux, il fallait passer du format

Code :
==== Blaireau (glouton) ====
:: '''Caractéristiques de départ.''' ''Taille'' P ; ''Vitesse de déplacement'' 9 m, creusement 3 m, escalade 3 m ; ''[[CA]]'' +2 d’armure naturelle ; ''Attaque'' morsure (1d4), 2 griffes (1d3) ; ''Caractéristiques'' [[Force|For]] 10, [[Dextérité|Dex]] 17, [[Constitution|Con]] 15, [[Intelligence|Int]] 2, [[Sagesse|Sag]] 12, [[Charisme|Cha]] 10 ; ''Attaques spéciales'' [[barbare#RAGEDEBERSERKER|rage]] (comme un [[barbare]], 6 rounds par jour) ; ''Particularités'' [[odorat]], [[vision nocturne]].

:: '''Développement au niveau 4.''' ''Taille'' M ; ''Attaque morsure'' (1d6), 2 griffes (1d4) ; ''Caractéristiques'' [[Force|For]] +4, [[Dextérité|Dex]] -2, [[Constitution|Con]] +2.


au format

Code :
<div class="BD">
{s:BDTitre|Blaireau (glouton)}
* '''Source''' Manuel du Joueur
(((Caractéristiques de départ)))
* '''Taille''' P
* '''Vitesse de déplacement''' 9 m, creusement 3 m, escalade 3 m
* '''CA''' +2 d’armure naturelle
* '''Attaque''' morsure (1d4), 2 griffes (1d3)
* '''Caractéristiques''' [[Force|For]] 10, [[Dextérité|Dex]] 17, [[Constitution|Con]] 15, [[Intelligence|Int]] 2, [[Sagesse|Sag]] 12, [[Charisme|Cha]] 10
* '''Attaques spéciales''' [[barbare#RAGEDEBERSERKER|rage]] (comme un [[barbare]], 6 rounds par jour)
* '''Particularités''' [[odorat]], [[vision nocturne]]
(((Développement au niveau 4)))
* '''Taille''' M
* '''Attaque morsure''' (1d6), 2 griffes (1d4)
* '''Caractéristiques''' [[Force|For]] +4, [[Dextérité|Dex]] -2, [[Constitution|Con]] +2
</div>


et ce, sur une petite vingtaine d'animaux. C'est possible de le faire en quelques opérations grâce aux expressions régulières. (Au fur et à mesure des opérations, j'introduis quelques nouveaux symboles, quand c'est nécessaire).

Étape 1 : les sous-titres. Dans le texte de départ, les sous-titres sont en gras (trois apostrophes de chaque côté), ils sont précédés de :: et ils sont suivis d'un point. Au final, il faudrait les mettre entre triples parenthèses et, pour que ça soit plus propres, les faire suivre d'un passage à la ligne.
— Le point . signifie "n'importe quel caractère" ; si on veut rechercher un point, on écrit \. (en règle générale, si un caractère a une signification particulière, pour faire une recherche qui porte sur ce caractère-là, on doit le faire précéder d'un "backslash" ; ainsi, \* permet de rechercher une astérisque alors que, sans le backslash, * signifie une répétition).
— Un passage à la ligne s'écrit \n (pour newline).

Expression de recherche :
Code :
:: '''\(.*\)\.'''_

— Notez que le _ est là pour représenter un espace : j'inclue dans l'expression de recherche l'espace qui suit le sous-titre, pour qu'il soit supprimé lors du remplacement
— On utilise \( \) pour encadrer le texte du sous-titre (dans ce cas-ci, ce sera "Caractéristiques de départ" ou "Développement au niveau 4". Dans le fichier de départ par contre, il y avait d'autres sous-titres (comme "Développement au niveau 7". Cela permettra de reprendre ce texte en utilisant \1 dans l'expression de remplacement.
— Le point final du sous-titre, noté par \., est laissé hors de la section \( \) car je ne compte pas le reprendre.

Expression de remplacement :
Code :
(((\1)))\n

— On remplace par le sous-titre encadré de triples parenthèses et on fait suivre le tout d'une retour à la ligne.

Résultat du rechercher-remplacer :
Code :
==== Blaireau (glouton) ====
(((Caractéristiques de départ)))
''Taille'' P ; ''Vitesse de déplacement'' 9 m, creusement 3 m, escalade 3 m ; ''[[CA]]'' +2 d’armure naturelle ; ''Attaque'' morsure (1d4), 2 griffes (1d3) ; ''Caractéristiques'' [[Force|For]] 10, [[Dextérité|Dex]] 17, [[Constitution|Con]] 15, [[Intelligence|Int]] 2, [[Sagesse|Sag]] 12, [[Charisme|Cha]] 10 ; ''Attaques spéciales'' [[barbare#RAGEDEBERSERKER|rage]] (comme un [[barbare]], 6 rounds par jour) ; ''Particularités'' [[odorat]], [[vision nocturne]].

(((Développement au niveau 4)))
''Taille'' M ; ''Attaque morsure'' (1d6), 2 griffes (1d4) ; ''Caractéristiques'' [[Force|For]] +4, [[Dextérité|Dex]] -2, [[Constitution|Con]] +2.


Étape 2 : les en-têtes. Maintenant, on aimerait bien modifier la description pour avoir un élément par ligne. Pour l'instant, les éléments ont des en-têtes en italique (deux apostrophes) suivies des informations nécessaires. Il faudrait que chacune des en-têtes se retrouve en tête de ligne, avec une apostrophe, et en gras. De plus, les points-virgules devraient disparaître.

On va tout d'abord commencer par mettre un élément par ligne, en remplaçant les points-virgules par des retours à la ligne.

Expression de recherche :
Code :
_;_

— Ici encore, les _ ne sont là que pour marquer les espaces ; dans l'expression régulière, il faut entrer des espaces.

Expression de remplacement :
Code :
\n


Résultat :
Code :
==== Blaireau (glouton) ====
(((Caractéristiques de départ)))
''Taille'' P
''Vitesse de déplacement'' 9 m, creusement 3 m, escalade 3 m
''[[CA]]'' +2 d’armure naturelle
''Attaque'' morsure (1d4), 2 griffes (1d3)
''Caractéristiques'' [[Force|For]] 10, [[Dextérité|Dex]] 17, [[Constitution|Con]] 15, [[Intelligence|Int]] 2, [[Sagesse|Sag]] 12, [[Charisme|Cha]] 10
''Attaques spéciales'' [[barbare#RAGEDEBERSERKER|rage]] (comme un [[barbare]], 6 rounds par jour)
''Particularités'' [[odorat]], [[vision nocturne]].

(((Développement au niveau 4)))
''Taille'' M
''Attaque morsure'' (1d6), 2 griffes (1d4)
''Caractéristiques'' [[Force|For]] +4, [[Dextérité|Dex]] -2, [[Constitution|Con]] +2.


Il faut maintenant transformer les italiques en gras et ajouter des astérisques en début de ligne.

Expression de recherche :
Code :
''\(.*\)''

— On recherche toutes les en-têtes en italique et on en mémorise le contenu.

Expression de remplacement :
Code :
* '''\1'''

— On va d'abord ajouter un astérisque. Note que * a un sens spécial lors des recherches (et donc, si on veut rechercher un astérisque, il faut utiliser \* dans l'expression de recherche), mais il n'a pas de sens spécial dans l'expression de remplacement ; on peut donc l'utiliser tel quel.
— Après l'astérisque, on ajoute un espace, puis le texte retenu entre triple apostrophes (pour qu'il soit en gras).

Résultat (ça commence à prendre forme) :
Code :
==== Blaireau (glouton) ====
(((Caractéristiques de départ)))
* '''Taille''' P
* '''Vitesse de déplacement''' 9 m, creusement 3 m, escalade 3 m
* '''[[CA]]''' +2 d’armure naturelle
* '''Attaque''' morsure (1d4), 2 griffes (1d3)
* '''Caractéristiques''' [[Force|For]] 10, [[Dextérité|Dex]] 17, [[Constitution|Con]] 15, [[Intelligence|Int]] 2, [[Sagesse|Sag]] 12, [[Charisme|Cha]] 10
* '''Attaques spéciales''' [[barbare#RAGEDEBERSERKER|rage]] (comme un [[barbare]], 6 rounds par jour)
* '''Particularités''' [[odorat]], [[vision nocturne]].

(((Développement au niveau 4)))
* '''Taille''' M
* '''Attaque morsure''' (1d6), 2 griffes (1d4)
* '''Caractéristiques''' [[Force|For]] +4, [[Dextérité|Dex]] -2, [[Constitution|Con]] +2.


Étape 3 : les titres. On recherche ici les titres, qui sont coincés entre des quadruples = ; on va les remplacer par tous les codes nécessaires. Notez que, dans l'exemple repris ici, il n'y a qu'un seul compagnon animal décrit ; dans le fichier de base, il y en avait plusieurs les uns à la suite des autres (c'est important pour la remarque ci-dessous).

Expression recherchée :
Code :
====_\(.*\)_====

— Ici aussi, _ n'est là que pour marquer les espaces. On retient le titre, sans les espaces qui le précèdent et suivent.

Expression de remplacement :
Code :
</div>\n<div CLASS="BD">\n{s:BDTitre|\1|}

— L'expression de remplacement a l'air compliquée ; elle l'est, mais pas en tant qu'expression régulière : jetez un coup d'œil au format désiré pour mieux comprendre.
— Oublions de </div>\n initial pendant un instant. Le bloc descriptif doit commencer par une ligne <div CLASS="BD"> ; c'est donc ce qu'on retrouve dans l'expression de remplacement. On ajoute un \n pour passer à la ligne.
— Ensuite, on doit trouver l'expression {s:BDTitre|...|}, où les trois points sont remplacés par le nom de la créature, à savoir \1. Et c'est bien ce que l'expression régulière dit.
— Maintenant, imaginez que ce remplacement se fait pour le titre de chacun des 20 compagnons animaux. Le </div> initial est là pour mettre un terme au bloc descriptif du monstre suivant. Cette partie n'a donc de sens que si on a une longue liste de descriptions d'animaux à modifier. Bien sûr, cela va ajouter un "</div>" en trop au tout début du fichier... mais ce n'est pas très grave : on pourra l'effacer ou, mieux, aller le replacer tout à la fin du fichier, après le dernier bloc descriptif qui, lui, n'aura pas reçu de </div> vu qu'il n'est suivi par aucun titre.

Résultat :
Code :
</div>
<div CLASS="BD">
{s:BDTitre|Blaireau (glouton)|}
(((Caractéristiques de départ)))
* '''Taille''' P
* '''Vitesse de déplacement''' 9 m, creusement 3 m, escalade 3 m
* '''[[CA]]''' +2 d’armure naturelle
* '''Attaque''' morsure (1d4), 2 griffes (1d3)
* '''Caractéristiques''' [[Force|For]] 10, [[Dextérité|Dex]] 17, [[Constitution|Con]] 15, [[Intelligence|Int]] 2, [[Sagesse|Sag]] 12, [[Charisme|Cha]] 10
* '''Attaques spéciales''' [[barbare#RAGEDEBERSERKER|rage]] (comme un [[barbare]], 6 rounds par jour)
* '''Particularités''' [[odorat]], [[vision nocturne]].

(((Développement au niveau 4)))
* '''Taille''' M
* '''Attaque morsure''' (1d6), 2 griffes (1d4)
* '''Caractéristiques''' [[Force|For]] +4, [[Dextérité|Dex]] -2, [[Constitution|Con]] +2.


Résultat après déplacement du </div> :
Code :
<div CLASS="BD">
{s:BDTitre|Blaireau (glouton)|}
(((Caractéristiques de départ)))
* '''Taille''' P
* '''Vitesse de déplacement''' 9 m, creusement 3 m, escalade 3 m
* '''[[CA]]''' +2 d’armure naturelle
* '''Attaque''' morsure (1d4), 2 griffes (1d3)
* '''Caractéristiques''' [[Force|For]] 10, [[Dextérité|Dex]] 17, [[Constitution|Con]] 15, [[Intelligence|Int]] 2, [[Sagesse|Sag]] 12, [[Charisme|Cha]] 10
* '''Attaques spéciales''' [[barbare#RAGEDEBERSERKER|rage]] (comme un [[barbare]], 6 rounds par jour)
* '''Particularités''' [[odorat]], [[vision nocturne]].

(((Développement au niveau 4)))
* '''Taille''' M
* '''Attaque morsure''' (1d6), 2 griffes (1d4)
* '''Caractéristiques''' [[Force|For]] +4, [[Dextérité|Dex]] -2, [[Constitution|Con]] +2.
</div>


Étape 4 : nettoyage. On y est presque. Il reste deux choses qui m'embêtent : les points en fin de ligne (voir Particularités dans la première partie et Caractéristiques dans la seconde partie) et la ligne blanche avant le second sous-titre. On va s'en occuper, en commençant par la ligne blanche.

Expression de recherche :
Code :
\n\n(((

— Une ligne blanche, ce n'est rien d'autre que deux "retours à la ligne" qui se suivent. Là, on va rechercher toutes les lignes blanches suivies de (((, c'est-à-dire d'un sous-titre.

Expression de remplacement :
Code :
\n(((

— Et on les remplace par un unique retour à la ligne (en conservant les trois parenthèses).

Résultat :
Code :
<div CLASS="BD">
{s:BDTitre|Blaireau (glouton)|}
(((Caractéristiques de départ)))
* '''Taille''' P
* '''Vitesse de déplacement''' 9 m, creusement 3 m, escalade 3 m
* '''[[CA]]''' +2 d’armure naturelle
* '''Attaque''' morsure (1d4), 2 griffes (1d3)
* '''Caractéristiques''' [[Force|For]] 10, [[Dextérité|Dex]] 17, [[Constitution|Con]] 15, [[Intelligence|Int]] 2, [[Sagesse|Sag]] 12, [[Charisme|Cha]] 10
* '''Attaques spéciales''' [[barbare#RAGEDEBERSERKER|rage]] (comme un [[barbare]], 6 rounds par jour)
* '''Particularités''' [[odorat]], [[vision nocturne]].
(((Développement au niveau 4)))
* '''Taille''' M
* '''Attaque morsure''' (1d6), 2 griffes (1d4)
* '''Caractéristiques''' [[Force|For]] +4, [[Dextérité|Dex]] -2, [[Constitution|Con]] +2.
</div>


(Ca peut paraître idiot de faire tout ça pour enlever juste une seule ligne, mais souvenez-vous qu'on travaille ici sur 20 blocs descriptifs à la fois.)

Expression de recherche :
Code :
\.$

— Un nouveau symbole : $ ; c'est le pendant de ^. Ce sont des symboles indicateurs de place. Le symbole ^ indique qu'on commence une ligne, alors que $ indique qu'on termine une ligne. Par exemple, l'expression régulière "^B" trouvera tous les B majuscules qui commencent (sont le premier caractère) une ligne ; l'expression régulière "B$" trouver tous les B majuscules qui terminent (sont le dernier caractère) une ligne.
— Ici, on recherche les points en fin de ligne ... mais comme "." est un caractère à signification spéciale, il faut utiliser \.

Expression de remplacement :
Code :

— L'expression vide : on veut simplement supprimer ces points.
— Notez qu'on aurait pu également rechercher "\.\n", c'est-à-dire les points suivis d'un retour à la ligne, mais alors, l'expression de remplacement aurait dû être "\n" sinon, on n'aurait pas seulement supprimé le point mais aussi le retour à la ligne.

Résultat (enfin) :
Code :
<div CLASS="BD">
{s:BDTitre|Blaireau (glouton)|}
(((Caractéristiques de départ)))
* '''Taille''' P
* '''Vitesse de déplacement''' 9 m, creusement 3 m, escalade 3 m
* '''[[CA]]''' +2 d’armure naturelle
* '''Attaque''' morsure (1d4), 2 griffes (1d3)
* '''Caractéristiques''' [[Force|For]] 10, [[Dextérité|Dex]] 17, [[Constitution|Con]] 15, [[Intelligence|Int]] 2, [[Sagesse|Sag]] 12, [[Charisme|Cha]] 10
* '''Attaques spéciales''' [[barbare#RAGEDEBERSERKER|rage]] (comme un [[barbare]], 6 rounds par jour)
* '''Particularités''' [[odorat]], [[vision nocturne]]
(((Développement au niveau 4)))
* '''Taille''' M
* '''Attaque morsure''' (1d6), 2 griffes (1d4)
* '''Caractéristiques''' [[Force|For]] +4, [[Dextérité|Dex]] -2, [[Constitution|Con]] +2
</div>


Voilà donc comment, en six (?) opérations de remplacement, on peut changer complètement le format d'une bonne partie d'une page. Ca prend une petite dizaine de minutes alors que, à la main, ça aurait pris beaucoup plus de temps (sans compter les oublis à corriger par la suite etc.)

Pour aller plus loin

— Si vous lisez l'anglais, vous pouvez consulter l'aide de Textpad au sujet des expressions régulières. On a couvert quelques principes de base ici, mais il y a bien d'autres symboles.
— Les expressions régulières s'écrivent, malheureusement, avec des formats qui varient d'un programme à l'autre ; vérifiez donc les conventions du programme que vous utilisez.
— voir aussi ici sur Wikipedia

Modifié par un utilisateur dimanche 4 juillet 2010 18:07:08(UTC)  | Raison: Non indiquée

Annonce
Offline rectulo  
#2 Envoyé le : dimanche 4 juillet 2010 20:22:03(UTC)
rectulo
Rang : Référent
Éclaireur: Éclaireur - contributeur confirmé aux wikis de Pathfinder-FR
Inscrit le : 22/12/2009(UTC)
Messages : 6,059
:'(
Si j'avais lu ce truc avant de commencer à wikiter, çà m'aurait pas donné envie.
Inévitable Lhaksharut du wiki
Utilisateurs actuellement sur ce sujet
Vous ne pouvez pas poster de nouveaux sujets dans ce forum.
Vous ne pouvez pas répondre aux sujets de ce forum.
Vous ne pouvez pas effacer vos messages dans ce forum.
Vous ne pouvez pas éditer vos messages dans ce forum.
Vous ne pouvez pas créer des sondages dans ce forum.
Vous ne pouvez pas voter dans les sondages de ce forum.

| Pathfinder-fr v2 Theme by Styx31, with some icons from fugue
Propulsé par YAF.NET | YAF.NET © 2003-2024, Yet Another Forum.NET