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

269 lines
12 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" />
2012-04-02 21:43:39 +00:00
<link rel="stylesheet" type="text/css" href="/Scratch/css/solarized.css" />
<link rel="stylesheet" type="text/css" href="/Scratch/css/idc.css" />
2012-05-02 15:43:56 +00:00
<link href='http://fonts.googleapis.com/css?family=Inconsolata' rel='stylesheet' type='text/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>
2012-05-02 15:43:56 +00:00
<script type="text/javascript" src="/Scratch/js/highlight/highlight.pack.js"></script>
<script type="text/javascript" src="/Scratch/js/article.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>
2012-05-02 15:43:56 +00:00
<div>
<pre><code class="ruby">if str.match(regexp) and
not str.match(other_regexp)
2011-04-20 12:29:01 +00:00
do_something
2012-05-02 15:43:56 +00:00
</code></pre>
</div>
<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>
<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
2012-05-02 15:43:56 +00:00
<div>
2011-04-20 12:29:01 +00:00
2012-05-02 15:43:56 +00:00
<pre><code class="ruby"># matcher toute les chaines qui
# matchent 'bull' (bullshit compris)
/bull/
2011-04-20 12:29:01 +00:00
2012-05-02 15:43:56 +00:00
# matcher toutes les chaines qui
# contiennent 'bull' sauf 'bullshit'
/bull([^s]|$)|
bulls([^h]|$)|
bullsh([^i]|$)|
bullshi([^t]|$)/
2011-04-20 12:29:01 +00:00
2012-05-02 15:43:56 +00:00
# une autre façon de l'écrire serait
/bull([^s]|$|s([^h]|$)|sh([^i]|$)|shi([^t]|$))/
</code></pre>
2011-04-20 12:29:01 +00:00
2012-05-02 15:43:56 +00:00
</div>
2011-04-20 12:29:01 +00:00
2012-05-02 15:43:56 +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-05-02 15:43:56 +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-05-02 15:43:56 +00:00
<p>Et voilà. Jespère que ça a pu vous aider.</p>
2011-04-20 12:29:01 +00:00
2012-05-02 15:43:56 +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>
<div>
<pre><code class="ruby"># Commence avec 'a': ^a
# Se finit par 'a': c$
# Contient 'b': .*b.*
# Mais n'est pas 'axbxc'
if str.match(/^a.*b.*c$/) and
not str.match(/^axbxc$/)
2011-04-20 12:29:01 +00:00
do_something
2012-05-02 15:43:56 +00:00
end
</code></pre>
</div>
2011-04-20 12:29:01 +00:00
<p>Une solution est&nbsp;:</p>
2012-05-02 15:43:56 +00:00
<div>
<pre><code class="ruby">/abc| # longueur 3
a.bc| # longueur 4
ab.c|
a[^x]b[^x]c| # longueur 5
a...*b.*c| # longueur &gt;5
a.*b...*c/
</code></pre>
</div>
2011-04-20 12:29:01 +00:00
2012-05-02 15:43:56 +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-05-02 15:43:56 +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>
2012-04-10 13:56:34 +00:00
<div id="social">
<div class="left"> <a href="https://twitter.com/share" class="twitter-share-button" data-via="yogsototh">Tweet</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
</div>
<div class="left"> <div class="g-plusone" data-size="medium" data-annotation="inline" data-width="106"></div>
<script type="text/javascript">
(function() {
var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
po.src = 'https://apis.google.com/js/plusone.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
})();
</script>
</div>
<div class="flush"></div>
</div>
2011-04-20 12:29:01 +00:00
<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();
}
2012-04-10 13:56:34 +00:00
document.write('<div id="clickcomment">Commentaires &amp; Partage</div>');
2011-04-20 12:29:01 +00:00
</script>
<div class="flush"></div>
2012-04-10 13:56:34 +00:00
2011-04-20 12:29:01 +00:00
<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">
2012-04-02 21:43:39 +00:00
<div>
2012-04-10 13:56:34 +00:00
<a href="https://twitter.com/yogsototh">Follow @yogsototh</a>
2012-04-02 21:43:39 +00:00
</div>
2011-04-20 12:29:01 +00:00
<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>
<div class="clear"></div>
</div>
</body>
</html>