Je débute avec BBedit pour convertir des pages html faite avec des
tableaux vers du CSS propre. J'ai fait un Applescript pour convertir
chaque page. principalement suppression des tab <td> et autres
remplacement, suppression.
Mon problème de débutant, je voudrais supprimer du texte où je connais
le début et la fin, mais avec un milieu variable en longueur (donc un
simple wildcard ne suffit pas). exemple
aa ddddddd bb
aa qqq bb
ma commande devrait donc être replace de "aa" jusqu'à "bb"
Je viens de passer plus d'une heure à lire le manuel de BBedit et je
patauge toujours. A l'aide. Merci.
ma commande devrait donc être replace de "aa" jusqu'à "bb"
Trouvé, c'est :
aa(.*)bb
le point en wildcard et l'astérisque comme répétiteur.
J'avais pas trouvé dans le help de BBedit, mais plus facilement dans http://www.anybrowser.org/bbedit/grep.shtml
Alain Le Gallou Email : alain4
Daniel
ma commande devrait donc être replace de "aa" jusqu'à "bb"
Trouvé, c'est :
aa(.*)bb
De mémoire, pour une phrase tel que: "aa hello world ! bb aa I am citizen of the Universe bb" l'expression aa(.*)bb capturera: " hello world ! bb aa I am citizen of the Universe " et non pas "hello world !" & "I am citizen of the Universe"
L'expression "aa((?!bb)*)bb" me semble plus adaptée, mais nous pouvons encore affinée la reconnaissance. Si l'on prend comme exemple: "aa Je ne connais pas l'éditeur bbedit bb" l'expression reconnaîtra uniquement " Je ne connais pas l'éditeur ". Il serait alors bon de délimiter la suite de caractères de reconnaissance afin de ne pas couper un mot en deux. Notre expression devient alors: <aa>((?!<bb>)*)<bb> Avec < et > on donne le sens "mot" à aa et bb
Pour reconnaître le texte entre des balises HTML: <aa>((?!</aa>)*)</aa>
NB1: Ces expressions captures les espaces après aa et avant bb. NB2: J'ignore si bbedit gère les regex
Daniel
ma commande devrait donc être replace de "aa" jusqu'à "bb"
Trouvé, c'est :
aa(.*)bb
De mémoire, pour une phrase tel que:
"aa hello world ! bb aa I am citizen of the Universe bb"
l'expression aa(.*)bb capturera:
" hello world ! bb aa I am citizen of the Universe "
et non pas
"hello world !" & "I am citizen of the Universe"
L'expression "aa((?!bb)*)bb" me semble plus adaptée, mais nous pouvons
encore affinée la reconnaissance.
Si l'on prend comme exemple:
"aa Je ne connais pas l'éditeur bbedit bb"
l'expression reconnaîtra uniquement " Je ne connais pas l'éditeur ".
Il serait alors bon de délimiter la suite de caractères de
reconnaissance afin de ne pas couper un mot en deux.
Notre expression devient alors: <aa>((?!<bb>)*)<bb>
Avec < et > on donne le sens "mot" à aa et bb
Pour reconnaître le texte entre des balises HTML: <aa>((?!</aa>)*)</aa>
NB1: Ces expressions captures les espaces après aa et avant bb.
NB2: J'ignore si bbedit gère les regex
ma commande devrait donc être replace de "aa" jusqu'à "bb"
Trouvé, c'est :
aa(.*)bb
De mémoire, pour une phrase tel que: "aa hello world ! bb aa I am citizen of the Universe bb" l'expression aa(.*)bb capturera: " hello world ! bb aa I am citizen of the Universe " et non pas "hello world !" & "I am citizen of the Universe"
L'expression "aa((?!bb)*)bb" me semble plus adaptée, mais nous pouvons encore affinée la reconnaissance. Si l'on prend comme exemple: "aa Je ne connais pas l'éditeur bbedit bb" l'expression reconnaîtra uniquement " Je ne connais pas l'éditeur ". Il serait alors bon de délimiter la suite de caractères de reconnaissance afin de ne pas couper un mot en deux. Notre expression devient alors: <aa>((?!<bb>)*)<bb> Avec < et > on donne le sens "mot" à aa et bb
Pour reconnaître le texte entre des balises HTML: <aa>((?!</aa>)*)</aa>
NB1: Ces expressions captures les espaces après aa et avant bb. NB2: J'ignore si bbedit gère les regex
Daniel
romer
Alain Le Gallou wrote:
Trouvé, c'est :
aa(.*)bb
le point en wildcard et l'astérisque comme répétiteur.
J'avais pas trouvé dans le help de BBedit, mais plus facilement dans http://www.anybrowser.org/bbedit/grep.shtml
Si - regarde mieux dans le manuel de BBedit qui est sur leur site. C'est le chapitre excellent qui traite des expressions régulières. Tu y trouveras des explications et exemples pour résoudre ce cas. -- A+
Romer
Alain Le Gallou <voirSignature@legallou.com> wrote:
Trouvé, c'est :
aa(.*)bb
le point en wildcard et l'astérisque comme répétiteur.
J'avais pas trouvé dans le help de BBedit, mais plus facilement dans
http://www.anybrowser.org/bbedit/grep.shtml
Si - regarde mieux dans le manuel de BBedit qui est sur leur site. C'est
le chapitre excellent qui traite des expressions régulières. Tu y
trouveras des explications et exemples pour résoudre ce cas.
--
A+
le point en wildcard et l'astérisque comme répétiteur.
J'avais pas trouvé dans le help de BBedit, mais plus facilement dans http://www.anybrowser.org/bbedit/grep.shtml
Si - regarde mieux dans le manuel de BBedit qui est sur leur site. C'est le chapitre excellent qui traite des expressions régulières. Tu y trouveras des explications et exemples pour résoudre ce cas. -- A+
Romer
Jaypee
Daniel wrote:
ma commande devrait donc être replace de "aa" jusqu'à "bb"
Trouvé, c'est :
aa(.*)bb
De mémoire, pour une phrase tel que: "aa hello world ! bb aa I am citizen of the Universe bb" l'expression aa(.*)bb capturera: " hello world ! bb aa I am citizen of the Universe " et non pas "hello world !" & "I am citizen of the Universe"
...
Daniel C'est la notion de "gourmandise", ou de "greedy match". Et selon
la doc, BBedit est systématiquement gourmant. La doc le signale et recommande d'utiliser d' exclure aa comme motif interne : aa([^aa]*)bb [^aa]* signifiant : tout sauf aa, répété 0 ou plusieurs fois.
Par ailleurs, BBedit ne connaît pas les parenthèses comme "mémoire". Dans les regexps, habituellement, on peut nommer le contenu des parenthèses avec $1, $2 etc pour préciser de remplacer $1 par xyz.
Selon ce qu'on souhaite le remplacement sera donc : aaxyzbb ou simplement xyz.
J-P
Daniel wrote:
ma commande devrait donc être replace de "aa" jusqu'à "bb"
Trouvé, c'est :
aa(.*)bb
De mémoire, pour une phrase tel que:
"aa hello world ! bb aa I am citizen of the Universe bb"
l'expression aa(.*)bb capturera:
" hello world ! bb aa I am citizen of the Universe "
et non pas
"hello world !" & "I am citizen of the Universe"
...
Daniel
C'est la notion de "gourmandise", ou de "greedy match". Et selon
la doc, BBedit est systématiquement gourmant.
La doc le signale et recommande d'utiliser d' exclure aa comme
motif interne :
aa([^aa]*)bb
[^aa]* signifiant : tout sauf aa, répété 0 ou plusieurs fois.
Par ailleurs, BBedit ne connaît pas les parenthèses comme "mémoire".
Dans les regexps, habituellement, on peut nommer le contenu des
parenthèses avec $1, $2 etc pour préciser de remplacer $1 par xyz.
Selon ce qu'on souhaite le remplacement sera donc :
aaxyzbb ou simplement xyz.
ma commande devrait donc être replace de "aa" jusqu'à "bb"
Trouvé, c'est :
aa(.*)bb
De mémoire, pour une phrase tel que: "aa hello world ! bb aa I am citizen of the Universe bb" l'expression aa(.*)bb capturera: " hello world ! bb aa I am citizen of the Universe " et non pas "hello world !" & "I am citizen of the Universe"
...
Daniel C'est la notion de "gourmandise", ou de "greedy match". Et selon
la doc, BBedit est systématiquement gourmant. La doc le signale et recommande d'utiliser d' exclure aa comme motif interne : aa([^aa]*)bb [^aa]* signifiant : tout sauf aa, répété 0 ou plusieurs fois.
Par ailleurs, BBedit ne connaît pas les parenthèses comme "mémoire". Dans les regexps, habituellement, on peut nommer le contenu des parenthèses avec $1, $2 etc pour préciser de remplacer $1 par xyz.
Selon ce qu'on souhaite le remplacement sera donc : aaxyzbb ou simplement xyz.
J-P
patpro ~ Patrick Proniewski
In article <44186fbf$0$19683$, Jaypee wrote:
Par ailleurs, BBedit ne connaît pas les parenthèses comme "mémoire". Dans les regexps, habituellement, on peut nommer le contenu des parenthèses avec $1, $2 etc pour préciser de remplacer $1 par xyz.
si tu veux dire par là que BBEdit ne sais pas faire ça :
chercher : toto(titi)tutu(tata) remplacer par : toto2tutu1 obtenir : tototatatututiti
alors tu devrais lire la doc.
patpro
In article <44186fbf$0$19683$8fcfb975@news.wanadoo.fr>,
Jaypee <rf.oodanaw@sd.eepyaj> wrote:
Par ailleurs, BBedit ne connaît pas les parenthèses comme "mémoire".
Dans les regexps, habituellement, on peut nommer le contenu des
parenthèses avec $1, $2 etc pour préciser de remplacer $1 par xyz.
si tu veux dire par là que BBEdit ne sais pas faire ça :
chercher : toto(titi)tutu(tata)
remplacer par : toto2tutu1
obtenir : tototatatututiti
Par ailleurs, BBedit ne connaît pas les parenthèses comme "mémoire". Dans les regexps, habituellement, on peut nommer le contenu des parenthèses avec $1, $2 etc pour préciser de remplacer $1 par xyz.
si tu veux dire par là que BBEdit ne sais pas faire ça :
chercher : toto(titi)tutu(tata) remplacer par : toto2tutu1 obtenir : tototatatututiti
alors tu devrais lire la doc.
patpro
blanc
Jaypee wrote:
Par ailleurs, BBedit ne connaît pas les parenthèses comme "mémoire". Dans les regexps, habituellement, on peut nommer le contenu des parenthèses avec $1, $2 etc pour préciser de remplacer $1 par xyz.
Bien sûr que si il les reconnait ! Seulement c'est 1 et 2 qu'il faut utiliser au lieu de $1 et $2.
Par exemple dans le texte ci-dessus, si je cherche :
ne(.*)pas(.*)comme
et le remplace par
1 parfaitement 2 mais pas comme
j'obtiens pour la première ligne :
<< Par ailleurs, BBedit connaît parfaitement les parenthèses mais pas comme "mémoire". >>
Je signale aussi que dans certains systèmes de regexp on doit utiliser ( et ) au lieu de ( et )
JPaul.
-- /==/==- Jean-Paul BLANC / /--/--// quelque-part (somewhere) |/| L | en (in) /|| = ||| FRANCE
Jaypee <rf.oodanaw@sd.eepyaj> wrote:
Par ailleurs, BBedit ne connaît pas les parenthèses comme "mémoire".
Dans les regexps, habituellement, on peut nommer le contenu des
parenthèses avec $1, $2 etc pour préciser de remplacer $1 par xyz.
Bien sûr que si il les reconnait !
Seulement c'est 1 et 2 qu'il faut utiliser au lieu de $1 et $2.
Par exemple dans le texte ci-dessus, si je cherche :
ne(.*)pas(.*)comme
et le remplace par
1 parfaitement 2 mais pas comme
j'obtiens pour la première ligne :
<< Par ailleurs, BBedit connaît parfaitement les parenthèses mais
pas comme "mémoire". >>
Je signale aussi que dans certains systèmes de regexp on doit utiliser
( et ) au lieu de ( et )
JPaul.
--
/==/==\- Jean-Paul BLANC
/ /--/--//\ quelque-part (somewhere)
|/| L |\ en (in)
/|| = |||\ FRANCE
Par ailleurs, BBedit ne connaît pas les parenthèses comme "mémoire". Dans les regexps, habituellement, on peut nommer le contenu des parenthèses avec $1, $2 etc pour préciser de remplacer $1 par xyz.
Bien sûr que si il les reconnait ! Seulement c'est 1 et 2 qu'il faut utiliser au lieu de $1 et $2.
Par exemple dans le texte ci-dessus, si je cherche :
ne(.*)pas(.*)comme
et le remplace par
1 parfaitement 2 mais pas comme
j'obtiens pour la première ligne :
<< Par ailleurs, BBedit connaît parfaitement les parenthèses mais pas comme "mémoire". >>
Je signale aussi que dans certains systèmes de regexp on doit utiliser ( et ) au lieu de ( et )
JPaul.
-- /==/==- Jean-Paul BLANC / /--/--// quelque-part (somewhere) |/| L | en (in) /|| = ||| FRANCE
Daniel
C'est la notion de "gourmandise", ou de "greedy match". C'est justement le sujet de mon intervention.
Et selon la doc, BBedit est systématiquement gourmant. c'est malheureux, ça limite son champ d'action.
La doc le signale et recommande d'utiliser d' exclure aa comme motif interne : aa([^aa]*)bb qui est de toute manière syntaxiquement incorrecte.
[^aa]* signifiant : tout sauf aa, répété 0 ou plusieurs fois. tout sauf a, aa, aaa ou a peut être répété de 0 à x fois, en fait
[^a]* reconnaîtrait la même chose que [^aa]*
Mes explications n'étant pas toujours claires, une ptite démo en ligne de commande s'impose: echo "aa a la maison bb, je suis chez moi." | sed "s/aa([^aa]*)bb/**1**/"
sort le résultat: aa a la maison bb, je suis chez moi.
alors que la commande: echo "aa je suis chez moi bb, a la maison." | sed "s/aa([^aa]*)bb/**1**/"
sort: ** je suis chez moi **, a la maison.
on constate que [^a]* ou [^aa]* réalise la même chose
-- Daniel
C'est la notion de "gourmandise", ou de "greedy match".
C'est justement le sujet de mon intervention.
Et selon la doc, BBedit est systématiquement gourmant.
c'est malheureux, ça limite son champ d'action.
La doc le signale et recommande d'utiliser d' exclure aa comme
motif interne :
aa([^aa]*)bb
qui est de toute manière syntaxiquement incorrecte.
[^aa]* signifiant : tout sauf aa, répété 0 ou plusieurs fois.
tout sauf a, aa, aaa ou a peut être répété de 0 à x fois, en fait
[^a]* reconnaîtrait la même chose que [^aa]*
Mes explications n'étant pas toujours claires, une ptite démo en ligne
de commande s'impose:
echo "aa a la maison bb, je suis chez moi." | sed "s/aa([^aa]*)bb/**1**/"
sort le résultat:
aa a la maison bb, je suis chez moi.
alors que la commande:
echo "aa je suis chez moi bb, a la maison." | sed "s/aa([^aa]*)bb/**1**/"
sort:
** je suis chez moi **, a la maison.
on constate que [^a]* ou [^aa]* réalise la même chose
C'est la notion de "gourmandise", ou de "greedy match". C'est justement le sujet de mon intervention.
Et selon la doc, BBedit est systématiquement gourmant. c'est malheureux, ça limite son champ d'action.
La doc le signale et recommande d'utiliser d' exclure aa comme motif interne : aa([^aa]*)bb qui est de toute manière syntaxiquement incorrecte.
[^aa]* signifiant : tout sauf aa, répété 0 ou plusieurs fois. tout sauf a, aa, aaa ou a peut être répété de 0 à x fois, en fait
[^a]* reconnaîtrait la même chose que [^aa]*
Mes explications n'étant pas toujours claires, une ptite démo en ligne de commande s'impose: echo "aa a la maison bb, je suis chez moi." | sed "s/aa([^aa]*)bb/**1**/"
sort le résultat: aa a la maison bb, je suis chez moi.
alors que la commande: echo "aa je suis chez moi bb, a la maison." | sed "s/aa([^aa]*)bb/**1**/"
sort: ** je suis chez moi **, a la maison.
on constate que [^a]* ou [^aa]* réalise la même chose
-- Daniel
Jaypee
Daniel wrote:
C'est la notion de "gourmandise", ou de "greedy match".
C'est justement le sujet de mon intervention.
Et selon la doc, BBedit est systématiquement gourmant.
c'est malheureux, ça limite son champ d'action.
La doc le signale et recommande d'utiliser d' exclure aa comme motif interne : aa([^aa]*)bb
qui est de toute manière syntaxiquement incorrecte.
[^aa]* signifiant : tout sauf aa, répété 0 ou plusieurs fois.
tout sauf a, aa, aaa ou a peut être répété de 0 à x fois, en fait [^a]* reconnaîtrait la même chose que [^aa]*
Mes explications n'étant pas toujours claires, une ptite démo en ligne de commande s'impose: echo "aa a la maison bb, je suis chez moi." | sed "s/aa([^aa]*)bb/**1**/"
sort le résultat: aa a la maison bb, je suis chez moi.
alors que la commande: echo "aa je suis chez moi bb, a la maison." | sed "s/aa([^aa]*)bb/**1**/"
sort: ** je suis chez moi **, a la maison.
on constate que [^a]* ou [^aa]* réalise la même chose
-- Daniel
OK, j'ai mérité ma leçon, fort intéressante au demeurant.
Donc si on a: <b>le texte à extraire</b> et <b>encore un autre morceau</b> et que l'on souhaite virer les balises, on peut faire comme çà:
chercher : (<b>([^<b>]*)(</b>) et remplacer par : 2 et on obtient alors : le texte à extraire et encore un autre morceau
J-P
Daniel wrote:
C'est la notion de "gourmandise", ou de "greedy match".
C'est justement le sujet de mon intervention.
Et selon la doc, BBedit est systématiquement gourmant.
c'est malheureux, ça limite son champ d'action.
La doc le signale et recommande d'utiliser d' exclure aa comme
motif interne :
aa([^aa]*)bb
qui est de toute manière syntaxiquement incorrecte.
[^aa]* signifiant : tout sauf aa, répété 0 ou plusieurs fois.
tout sauf a, aa, aaa ou a peut être répété de 0 à x fois, en fait
[^a]* reconnaîtrait la même chose que [^aa]*
Mes explications n'étant pas toujours claires, une ptite démo en ligne
de commande s'impose:
echo "aa a la maison bb, je suis chez moi." | sed
"s/aa([^aa]*)bb/**1**/"
sort le résultat:
aa a la maison bb, je suis chez moi.
alors que la commande:
echo "aa je suis chez moi bb, a la maison." | sed
"s/aa([^aa]*)bb/**1**/"
sort:
** je suis chez moi **, a la maison.
on constate que [^a]* ou [^aa]* réalise la même chose
--
Daniel
OK, j'ai mérité ma leçon, fort intéressante au demeurant.
Donc si on a:
<b>le texte à extraire</b> et <b>encore un autre morceau</b>
et que l'on souhaite virer les balises, on peut faire comme çà:
chercher : (<b>([^<b>]*)(</b>)
et remplacer par : 2
et on obtient alors :
le texte à extraire et encore un autre morceau
C'est la notion de "gourmandise", ou de "greedy match".
C'est justement le sujet de mon intervention.
Et selon la doc, BBedit est systématiquement gourmant.
c'est malheureux, ça limite son champ d'action.
La doc le signale et recommande d'utiliser d' exclure aa comme motif interne : aa([^aa]*)bb
qui est de toute manière syntaxiquement incorrecte.
[^aa]* signifiant : tout sauf aa, répété 0 ou plusieurs fois.
tout sauf a, aa, aaa ou a peut être répété de 0 à x fois, en fait [^a]* reconnaîtrait la même chose que [^aa]*
Mes explications n'étant pas toujours claires, une ptite démo en ligne de commande s'impose: echo "aa a la maison bb, je suis chez moi." | sed "s/aa([^aa]*)bb/**1**/"
sort le résultat: aa a la maison bb, je suis chez moi.
alors que la commande: echo "aa je suis chez moi bb, a la maison." | sed "s/aa([^aa]*)bb/**1**/"
sort: ** je suis chez moi **, a la maison.
on constate que [^a]* ou [^aa]* réalise la même chose
-- Daniel
OK, j'ai mérité ma leçon, fort intéressante au demeurant.
Donc si on a: <b>le texte à extraire</b> et <b>encore un autre morceau</b> et que l'on souhaite virer les balises, on peut faire comme çà:
chercher : (<b>([^<b>]*)(</b>) et remplacer par : 2 et on obtient alors : le texte à extraire et encore un autre morceau
J-P
laurent.pertois
Daniel wrote:
Et selon la doc, BBedit est systématiquement gourmant. c'est malheureux, ça limite son champ d'action.
Je n'y connais pas grand chose en grep, mais voici quand même ce que je lis dans la doc de BBEdit :
To work around this "longest match" behavior, you can modify your pattern to take advantage of non-greedy quantifiers.
-- Politically Correct Unix - UTILITIES The "touch" command has been removed from the standard distribution due to its inappropriate use by high-level managers.
Daniel <keolan@wanadoo.fr> wrote:
Et selon la doc, BBedit est systématiquement gourmant.
c'est malheureux, ça limite son champ d'action.
Je n'y connais pas grand chose en grep, mais voici quand même ce que je
lis dans la doc de BBEdit :
To work around this "longest match" behavior, you can modify your
pattern to take advantage of non-greedy quantifiers.
--
Politically Correct Unix - UTILITIES
The "touch" command has been removed from the standard distribution due
to its inappropriate use by high-level managers.
Et selon la doc, BBedit est systématiquement gourmant. c'est malheureux, ça limite son champ d'action.
Je n'y connais pas grand chose en grep, mais voici quand même ce que je lis dans la doc de BBEdit :
To work around this "longest match" behavior, you can modify your pattern to take advantage of non-greedy quantifiers.
-- Politically Correct Unix - UTILITIES The "touch" command has been removed from the standard distribution due to its inappropriate use by high-level managers.
Daniel
Donc si on a: <b>le texte à extraire</b> et <b>encore un autre morceau</b> et que l'on souhaite virer les balises, on peut faire comme çà:
chercher : (<b>([^<b>]*)(</b>) et remplacer par : 2 Pour extraire un texte entre balise, utiliser [^] n'est pas correcte.
Pour faire concis, l'expression ne reconnaîtra pas le bloc de caractère comme ceci "<" suivi de "b" suivi de ">" mais comme "<" ou "b" ou ">", ce qui signifie que la reconnaissance s'arrêtera (dû à la négation ^) au premier b ou chevron rencontré. Il est préférable d'utiliser un test avant négatif "((?!</b>)*)" qui fait exactement ce que l'on souhaite. Sauf si traitement particulier, le premier jeu de parenthèse est inutile et est consommatrice de ressources. L'expression devrait être "<b>((?!</b>)*)</b>", et 1 est le texte capturé.
-- Daniel
Donc si on a:
<b>le texte à extraire</b> et <b>encore un autre morceau</b>
et que l'on souhaite virer les balises, on peut faire comme çà:
chercher : (<b>([^<b>]*)(</b>)
et remplacer par : 2
Pour extraire un texte entre balise, utiliser [^] n'est pas correcte.
Pour faire concis, l'expression ne reconnaîtra pas le bloc de caractère
comme ceci "<" suivi de "b" suivi de ">" mais comme "<" ou "b" ou ">",
ce qui signifie que la reconnaissance s'arrêtera (dû à la négation ^) au
premier b ou chevron rencontré. Il est préférable d'utiliser un test
avant négatif "((?!</b>)*)" qui fait exactement ce que l'on souhaite.
Sauf si traitement particulier, le premier jeu de parenthèse est inutile
et est consommatrice de ressources.
L'expression devrait être "<b>((?!</b>)*)</b>", et 1 est le texte
capturé.
Donc si on a: <b>le texte à extraire</b> et <b>encore un autre morceau</b> et que l'on souhaite virer les balises, on peut faire comme çà:
chercher : (<b>([^<b>]*)(</b>) et remplacer par : 2 Pour extraire un texte entre balise, utiliser [^] n'est pas correcte.
Pour faire concis, l'expression ne reconnaîtra pas le bloc de caractère comme ceci "<" suivi de "b" suivi de ">" mais comme "<" ou "b" ou ">", ce qui signifie que la reconnaissance s'arrêtera (dû à la négation ^) au premier b ou chevron rencontré. Il est préférable d'utiliser un test avant négatif "((?!</b>)*)" qui fait exactement ce que l'on souhaite. Sauf si traitement particulier, le premier jeu de parenthèse est inutile et est consommatrice de ressources. L'expression devrait être "<b>((?!</b>)*)</b>", et 1 est le texte capturé.