scratch/output/Scratch/fr/blog/2010-02-15-All-but-something-regexp/index.html

243 lines
15 KiB
HTML
Raw Normal View History

2011-04-20 12:29:01 +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" />
2011-04-20 12:29:01 +00:00
<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>
2011-04-20 12:29:01 +00:00
<!--[if lt IE 9]>
<script src="http://ie7-js.googlecode.com/svn/version/2.1(beta4)/IE9.js"></script>
<![endif]-->
<title>Expression régulière pour tout sauf quelquechose</title>
</head>
2011-10-18 22:30:00 +00:00
<body lang="fr" class="article">
2011-04-20 12:29:01 +00:00
<script type="text/javascript">// <![CDATA[
document.write('<div id="blackpage"><img src="/Scratch/img/loading.gif" alt="Chargement en cours..."/></div>');
2011-04-20 12:29:01 +00:00
// ]]>
</script>
<div id="content">
<div id="choix">
<div class="return"><a href="#entete">&darr; Menu &darr;</a></div>
<div id="choixlang">
<a href="/Scratch/en/blog/2010-02-15-All-but-something-regexp/" onclick="setLanguage('en')">in English</a>
2011-04-20 12:29:01 +00:00
</div>
2011-09-28 16:05:55 +00:00
<div class="flush"></div>
2011-04-20 12:29:01 +00:00
</div>
<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&nbsp;:</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>
2012-01-20 13:41:44 +00:00
<p>et vous devez obtenir le même comportement avec seulement une expression régulière. Le problème cest que le complémentaire des régulier nest pas régulier. Celà peut savérer impossible.</p>
2011-04-20 12:29:01 +00:00
2012-01-20 13:41:44 +00:00
<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 dy arriver&nbsp;:</p>
2011-04-20 12:29:01 +00:00
<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>
2012-01-20 13:41:44 +00:00
<p>Regardons de plus près. Dans la première ligne, lexpression est&nbsp;:
2011-04-20 12:29:01 +00:00
<code>bull([^s]|$)</code>, pourquoi avons nous besoin du <code>$</code>&nbsp;?
Parce que sans lui, le mot <code>bull</code> ne serait pas matché. Cette expression signifie&nbsp;:</p>
<blockquote>
<p>La chaine finie par <code>bull</code> <br />
ou, <br />
2012-01-20 13:41:44 +00:00
contient <code>bull</code> suivi dune lettre différente de <code>s</code>.</p>
2011-04-20 12:29:01 +00:00
</blockquote>
2012-01-20 13:41:44 +00:00
<p>Et voilà. Jespère que ça a pu vous aider.</p>
2011-04-20 12:29:01 +00:00
2012-01-20 13:41:44 +00:00
<p>Notez que cette méthode nest pas toujours la meilleure. Par exemple essayons décrire une expression régulière équivalente à lexpression conditionnelle suivante&nbsp;:</p>
2011-04-20 12:29:01 +00:00
<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&nbsp;:</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 &gt;5</span>
<span class="StringRegexp">a.*b...*c</span><span class="StringRegexp"><span class="StringRegexp">/</span></span>
</pre></div>
2012-01-20 13:41:44 +00:00
<p>Cette solution utilise la longueur maximale de la chaine qui ne doit pas être matchée. Il existe certainement dautres méthodes. Mais la leçon importante cest quil nest pas naturel dexclure des solutions dun expression régulière.</p>
2011-04-20 12:29:01 +00:00
<hr />
2012-01-20 13:41:44 +00:00
<p><small><a name="note1"></a>
Il peut être démontré que tout ensemble régulier privé dun ensemble fini est aussi régulier.
2011-04-20 12:29:01 +00:00
</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>
Vous devez activer javascript pour commenter.
</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/';
2011-04-20 12:29:01 +00:00
</script>
<span id="IDCommentsPostTitle" style="display:none"></span>
<script type='text/javascript' src='/Scratch/js/genericCommentWrapperV2.js'></script>
2011-04-20 12:29:01 +00:00
</div>
<div id="entete" class="corps_spaced">
<div id="liens">
<ul><li><a href="/Scratch/fr/">Bienvenue</a></li>
<li><a href="/Scratch/fr/blog/">Blog</a></li>
<li><a href="/Scratch/fr/softwares/">Softwares</a></li>
<li><a href="/Scratch/fr/about/">À propos</a></li></ul>
2011-04-20 12:29:01 +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">
<a href="/Scratch/fr/blog/2010-01-12-antialias-font-in-Firefox-under-Ubuntu/"><span class="nicer">«</span>&nbsp;Fontes adoucies sous Ubuntu Firefox</a>
2011-04-20 12:29:01 +00:00
</div>
<div class="previous_article">
<a href="/Scratch/fr/blog/2010-01-04-Change-default-shell-on-Mac-OS-X/"><span class="nicer">«</span>&nbsp;Changer le shell par défaut sous Mac OS X</a>
2011-04-20 12:29:01 +00:00
</div>
<div class="previous_article">
<a href="/Scratch/fr/blog/2009-12-14-Git-vs--Bzr/"><span class="nicer">«</span>&nbsp;Git ou Bazaar ?</a>
2011-04-20 12:29:01 +00:00
</div>
</div>
<div id="next_articles">
articles suivants
<div class="next_article">
<a href="/Scratch/fr/blog/2010-02-16-All-but-something-regexp--2-/">Tout sauf quelquechose en expression régulière.&nbsp;<span class="nicer">»</span></a>
2011-04-20 12:29:01 +00:00
</div>
<div class="next_article">
<a href="/Scratch/fr/blog/2010-02-18-split-a-file-by-keyword/">découper un fichier par mots clés&nbsp;<span class="nicer">»</span></a>
2011-04-20 12:29:01 +00:00
</div>
<div class="next_article">
<a href="/Scratch/fr/blog/2010-02-23-When-regexp-is-not-the-best-solution/">Quand se passer des expressions régulières ?&nbsp;<span class="nicer">»</span></a>
2011-04-20 12:29:01 +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">
Écrit le : 15/02/2010
modifié le : 11/06/2010
</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>
2011-04-20 12:29:01 +00:00
<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>
2011-04-20 12:29:01 +00:00
</div>
</div>
<div class="clear"></div>
</div>
</body>
</html>