2010-08-23 12:26:48 +00:00
<?xml version="1.0" encoding="utf-8"?>
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
< html xmlns = "http://www.w3.org/1999/xhtml" lang = "fr" xml:lang = "fr" >
< head >
< meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" / >
< meta name = "keywords" content = "regexp, regular expression" >
< link rel = "shortcut icon" type = "image/x-icon" href = "/Scratch/img/favicon.ico" / >
< link rel = "stylesheet" type = "text/css" href = "/Scratch/assets/css/main.css" / >
< link rel = "stylesheet" type = "text/css" href = "/Scratch/css/twilight.css" / >
< link rel = "stylesheet" type = "text/css" href = "/Scratch/css/idc.css" / >
< link rel = "alternate" type = "application/rss+xml" title = "RSS" href = "http://feeds.feedburner.com/yannespositocomfr" / >
< link rel = "alternate" lang = "fr" xml:lang = "fr" title = "Expression régulière pour tout sauf quelquechose" type = "text/html" hreflang = "fr" href = "/Scratch/fr/blog/2010-02-15-All-but-something-regexp/" / >
< link rel = "alternate" lang = "en" xml:lang = "en" title = "Pragmatic Regular Expression Exclude" type = "text/html" hreflang = "en" href = "/Scratch/en/blog/2010-02-15-All-but-something-regexp/" / >
< script type = "text/javascript" src = "/Scratch/js/jquery-1.3.1.min.js" > < / script >
< script type = "text/javascript" src = "/Scratch/js/jquery.cookie.js" > < / script >
< script type = "text/javascript" src = "/Scratch/js/index.js" > < / script >
< title > Expression régulière pour tout sauf quelquechose< / title >
< / head >
< body lang = "fr" >
< script type = "text/javascript" > / / < ! [ C D A T A [
document.write('< div id = "blackpage" > < img src = "/Scratch/img/loading.gif" alt = "Chargement en cours..." / > < / div > ');
// ]]>
< / script >
< div id = "content" >
2010-09-27 18:49:15 +00:00
< div id = "choix" >
< div class = "return" > < a href = "#entete" > ↓ Menu ↓ < / a > < / div >
< div id = "choixlang" >
< a href = "/Scratch/en/blog/2010-02-15-All-but-something-regexp/" onclick = "setLanguage('en')" > in English< / a >
< / div >
< / div >
< img src = "/Scratch/img/presentation.png" alt = "Presentation drawing" / >
2010-08-23 12:26:48 +00:00
< div id = "titre" >
< h1 >
Expression régulière pour tout sauf quelquechose
< / h1 >
< / div >
< div class = "flush" > < / div >
< div class = "flush" > < / div >
< div id = "afterheader" >
< div class = "corps" >
< p > Parfois vous ne pouvez simplement pas écrire :< / p >
< div > < pre class = "twilight" >
< span class = "Keyword" > if< / span > str.< span class = "Entity" > match< / span > (regexp) < span class = "Keyword" > and< / span >
< span class = "Keyword" > not< / span > str.< span class = "Entity" > match< / span > (other_regexp)
do_something
< / pre > < / div >
< p > et vous devez obtenir le même comportement avec seulement une expression régulière. Le problème c’ est que le complémentaire des régulier n’ est pas régulier. Celà peut s’ avérer impossible.< / p >
< p > Cependant, pour certaines expressions ce peut être possible< sup > < a href = "#note1" > † < / a > < / sup > . Disons que vous souhaitez < em > matcher< / em > toutes les lignes contenant le mot < code > bull< / code > , mais que vous ne souhaitez pas matcher < code > bullshit< / code > . Voici une façon sympa d’ y arriver :< / p >
< div > < pre class = "twilight" >
< span class = "Comment" > < span class = "Comment" > #< / span > matcher toute les chaines qui < / span >
< span class = "Comment" > < span class = "Comment" > #< / span > matchent 'bull' (bullshit compris)< / span >
< span class = "StringRegexp" > < span class = "StringRegexp" > /< / span > < / span > < span class = "StringRegexp" > bull< / span > < span class = "StringRegexp" > < span class = "StringRegexp" > /< / span > < / span >
< span class = "Comment" > < span class = "Comment" > #< / span > matcher toutes les chaines qui < / span >
< span class = "Comment" > < span class = "Comment" > #< / span > contiennent 'bull' sauf 'bullshit'< / span >
< span class = "StringRegexp" > < span class = "StringRegexp" > /< / span > < / span > < span class = "StringRegexp" > bull< span class = "StringRegexp" > < span class = "StringRegexp" > (< / span > < span class = "StringRegexp" > < span class = "StringRegexp" > [< / span > ^s< span class = "StringRegexp" > ]< / span > < / span > |$< span class = "StringRegexp" > )< / span > < / span > |< / span >
< span class = "StringRegexp" > bulls< span class = "StringRegexp" > < span class = "StringRegexp" > (< / span > < span class = "StringRegexp" > < span class = "StringRegexp" > [< / span > ^h< span class = "StringRegexp" > ]< / span > < / span > |$< span class = "StringRegexp" > )< / span > < / span > |< / span >
< span class = "StringRegexp" > bullsh< span class = "StringRegexp" > < span class = "StringRegexp" > (< / span > < span class = "StringRegexp" > < span class = "StringRegexp" > [< / span > ^i< span class = "StringRegexp" > ]< / span > < / span > |$< span class = "StringRegexp" > )< / span > < / span > |< / span >
< span class = "StringRegexp" > bullshi< span class = "StringRegexp" > < span class = "StringRegexp" > (< / span > < span class = "StringRegexp" > < span class = "StringRegexp" > [< / span > ^t< span class = "StringRegexp" > ]< / span > < / span > |$< span class = "StringRegexp" > )< / span > < / span > < / span > < span class = "StringRegexp" > < span class = "StringRegexp" > /< / span > < / span >
< span class = "Comment" > < span class = "Comment" > #< / span > une autre façon de l'écrire serait< / span >
< span class = "StringRegexp" > < span class = "StringRegexp" > /< / span > < / span > < span class = "StringRegexp" > bull< span class = "StringRegexp" > < span class = "StringRegexp" > (< / span > < span class = "StringRegexp" > < span class = "StringRegexp" > [< / span > ^s< span class = "StringRegexp" > ]< / span > < / span > |$|s< span class = "StringRegexp" > < span class = "StringRegexp" > (< / span > < span class = "StringRegexp" > < span class = "StringRegexp" > [< / span > ^h< span class = "StringRegexp" > ]< / span > < / span > |$< span class = "StringRegexp" > )< / span > < / span > |sh< span class = "StringRegexp" > < span class = "StringRegexp" > (< / span > < span class = "StringRegexp" > < span class = "StringRegexp" > [< / span > ^i< span class = "StringRegexp" > ]< / span > < / span > |$< span class = "StringRegexp" > )< / span > < / span > |shi< span class = "StringRegexp" > < span class = "StringRegexp" > (< / span > < span class = "StringRegexp" > < span class = "StringRegexp" > [< / span > ^t< span class = "StringRegexp" > ]< / span > < / span > |$< span class = "StringRegexp" > )< / span > < / span > < span class = "StringRegexp" > )< / span > < / span > < / span > < span class = "StringRegexp" > < span class = "StringRegexp" > /< / span > < / span >
< / pre > < / div >
< p > Regardons de plus près. Dans la première ligne, l’ expression est :
< code > bull([^s]|$)< / code > , pourquoi avons nous besoin du < code > $< / code > ?
Parce que sans lui, le mot < code > bull< / code > ne serait pas matché. Cette expression signifie :< / p >
< blockquote >
< p > La chaine finie par < code > bull< / code > < br / >
ou, < br / >
contient < code > bull< / code > suivi d’ une lettre différente de < code > s< / code > .< / p >
< / blockquote >
< p > Et voilà. J’ espère que ça a pu vous aider.< / p >
< p > Notez que cette méthode n’ est pas toujours la meilleure. Par exemple essayons d’ écrire une expression régulière équivalente à l’ expression conditionnelle suivante :< / p >
< div > < pre class = "twilight" >
< span class = "Comment" > < span class = "Comment" > #< / span > Commence avec 'a': ^a< / span >
< span class = "Comment" > < span class = "Comment" > #< / span > Se finit par 'a': c$< / span >
< span class = "Comment" > < span class = "Comment" > #< / span > Contient 'b': .*b.*< / span >
< span class = "Comment" > < span class = "Comment" > #< / span > Mais n'est pas 'axbxc'< / span >
< span class = "Keyword" > if< / span > str.< span class = "Entity" > match< / span > (< span class = "StringRegexp" > < span class = "StringRegexp" > /< / span > < / span > < span class = "StringRegexp" > ^a.*b.*c$< / span > < span class = "StringRegexp" > < span class = "StringRegexp" > /< / span > < / span > ) < span class = "Keyword" > and< / span >
< span class = "Keyword" > not< / span > str.< span class = "Entity" > match< / span > (< span class = "StringRegexp" > < span class = "StringRegexp" > /< / span > < / span > < span class = "StringRegexp" > ^axbxc$< / span > < span class = "StringRegexp" > < span class = "StringRegexp" > /< / span > < / span > )
do_something
< span class = "Keyword" > end< / span >
< / pre > < / div >
< p > Une solution est :< / p >
< div > < pre class = "twilight" >
< span class = "StringRegexp" > < span class = "StringRegexp" > /< / span > < / span > < span class = "StringRegexp" > abc| < span class = "Comment" > < span class = "Comment" > #< / span > longueur 3< / span > < / span >
< span class = "StringRegexp" > a.bc| < span class = "Comment" > < span class = "Comment" > #< / span > longueur 4< / span > < / span >
< span class = "StringRegexp" > ab.c|< / span >
< span class = "StringRegexp" > a< span class = "StringRegexp" > < span class = "StringRegexp" > [< / span > ^x< span class = "StringRegexp" > ]< / span > < / span > b< span class = "StringRegexp" > < span class = "StringRegexp" > [< / span > ^x< span class = "StringRegexp" > ]< / span > < / span > c| < span class = "Comment" > < span class = "Comment" > #< / span > longueur 5< / span > < / span >
< span class = "StringRegexp" > a...*b.*c| # longueur > 5< / span >
< span class = "StringRegexp" > a.*b...*c< / span > < span class = "StringRegexp" > < span class = "StringRegexp" > /< / span > < / span >
< / pre > < / div >
< p > Cette solution utilise la longueur maximale de la chaine qui ne doit pas être matchée. Il existe certainement d’ autres méthodes. Mais la leçon importante c’ est qu’ il n’ est pas naturel d’ exclure des solutions d’ un expression régulière.< / p >
< hr / >
< p > < small > < a name = "note1" > † < / a >
Il peut être démontré que tout ensemble régulier privé d’ un ensemble fini est aussi régulier.
< / small > < / p >
< / div >
< div id = "choixrss" >
< a id = "rss" href = "http://feeds.feedburner.com/yannespositocomfr" >
s'abonner
< / a >
< / div >
< script type = "text/javascript" >
$(document).ready(function(){
$('#comment').hide();
$('#clickcomment').click(showComments);
});
function showComments() {
$('#comment').show();
$('#clickcomment').fadeOut();
}
document.write('< div id = "clickcomment" > Commentaires< / div > ');
< / script >
< div class = "flush" > < / div >
< div class = "corps" id = "comment" >
< h2 class = "first" > commentaires< / h2 >
< noscript >
< / noscript >
< script type = "text/javascript" >
var idcomments_acct = 'a307f0044511ff1b5cfca573fc0a52e7';
var idcomments_post_id = '/Scratch/fr/blog/2010-02-15-All-but-something-regexp/';
var idcomments_post_url = 'http://yannesposito.com/Scratch/fr/blog/2010-02-15-All-but-something-regexp/';
< / script >
< span id = "IDCommentsPostTitle" style = "display:none" > < / span >
< script type = 'text/javascript' src = '/Scratch/js/genericCommentWrapperV2.js' > < / script >
< / div >
< div id = "entete" class = "corps_spaced" >
< div id = "liens" >
2010-09-17 15:15:29 +00:00
< ul > < li > < a href = "/Scratch/fr/" > Accueil< / a > < / li >
2010-08-23 12:26:48 +00:00
< li > < a href = "/Scratch/fr/blog/" > Blog< / a > < / li >
2010-09-30 13:01:14 +00:00
< li > < a href = "/Scratch/fr/softwares/" > Softwares< / a > < / li >
2010-09-28 01:00:51 +00:00
< li > < a href = "/Scratch/fr/about/" > À propos< / a > < / li > < / ul >
2010-08-23 12:26:48 +00:00
< / div >
< div class = "flush" > < / div >
< hr / >
< div id = "next_before_articles" >
< div id = "previous_articles" >
articles précédents
< div class = "previous_article" >
2010-09-28 15:10:12 +00:00
< a href = "/Scratch/fr/blog/2010-01-12-antialias-font-in-Firefox-under-Ubuntu/" > < span class = "nicer" > «< / span > Fontes adoucies sous Ubuntu Firefox< / a >
2010-08-23 12:26:48 +00:00
< / div >
< div class = "previous_article" >
2010-09-28 15:10:12 +00:00
< a href = "/Scratch/fr/blog/2010-01-04-Change-default-shell-on-Mac-OS-X/" > < span class = "nicer" > «< / span > Changer le shell par défaut sous Mac OS X< / a >
2010-08-23 12:26:48 +00:00
< / div >
< div class = "previous_article" >
2010-09-28 15:10:12 +00:00
< a href = "/Scratch/fr/blog/2009-12-14-Git-vs--Bzr/" > < span class = "nicer" > «< / span > Git ou Bazaar ?< / a >
2010-08-23 12:26:48 +00:00
< / div >
< / div >
< div id = "next_articles" >
articles suivants
< div class = "next_article" >
2010-09-28 15:10:12 +00:00
< a href = "/Scratch/fr/blog/2010-02-16-All-but-something-regexp--2-/" > Tout sauf quelquechose en expression régulière. < span class = "nicer" > »< / span > < / a >
2010-08-23 12:26:48 +00:00
< / div >
< div class = "next_article" >
2010-09-28 15:10:12 +00:00
< a href = "/Scratch/fr/blog/2010-02-18-split-a-file-by-keyword/" > découper un fichier par mots clés < span class = "nicer" > »< / span > < / a >
2010-08-23 12:26:48 +00:00
< / div >
< div class = "next_article" >
2010-09-28 15:10:12 +00:00
< a href = "/Scratch/fr/blog/2010-02-23-When-regexp-is-not-the-best-solution/" > Quand se passer des expressions régulières ? < span class = "nicer" > »< / span > < / a >
2010-08-23 12:26:48 +00:00
< / div >
< / div >
< div class = "flush" > < / div >
< / div >
< / div >
< div id = "bottom" >
< div >
< a rel = "license" href = "http://creativecommons.org/licenses/by-sa/3.0/deed.fr" > Droits de reproduction ©, Yann Esposito< / a >
< / div >
< div id = "lastmod" >
2010-08-31 13:06:43 +00:00
Écrit le : 15/02/2010
2010-09-02 09:51:46 +00:00
modifié le : 11/06/2010
2010-08-23 12:26:48 +00:00
< / div >
< div >
Site entièrement réalisé avec
< a href = "http://www.vim.org" > Vim< / a >
et
< a href = "http://nanoc.stoneship.org" > nanoc< / a >
< / div >
< div >
< a href = "/Scratch/fr/validation/" > Validation< / a >
< a href = "http://validator.w3.org/check?uri=referer" > [xhtml] < / a >
.
< a href = "http://jigsaw.w3.org/css-validator/check/referer?profile=css3" > [css] < / a >
.
< a href = "http://validator.w3.org/feed/check.cgi?url=http%3A//yannesposito.com/Scratch/fr/blog/feed/feed.xml" > [rss]< / a >
< / div >
< / div >
< div class = "clear" > < / div >
< / div >
< / body >
< / html >