yannesposito.com/Scratch/fr/blog/2010-02-15-All-but-something-regexp/index.html
2013-03-16 09:31:39 +01:00

149 lines
9.1 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>YBlog - Expression régulière pour tout sauf quelquechose</title>
<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/css/scientific.css" />
<link rel="stylesheet" type="text/css" href="../../../../Scratch/css/solarized.css" />
<!-- Font -->
<link href="http://fonts.googleapis.com/css?family=Inconsolata" rel="stylesheet" type="text/css">
<link href="http://fonts.googleapis.com/css?family=Droid+Sans:400,700" rel="stylesheet" type="text/css">
<link rel="alternate" type="application/rss+xml" title="RSS" href="http://feeds.feedburner.com/yannespositocomfr" />
<!--[if lt IE 9]>
<script src="http://ie7-js.googlecode.com/svn/version/2.1(beta4)/IE9.js"></script>
<![endif]-->
</head>
<body lang="fr">
<script type="text/javascript">//
document.write('<div id="blackpage"><div>Bientôt<img src="/Scratch/img/loading.gif" alt="Chargement en cours"></img></div></div>');
//
</script>
<div id="content">
<div id="header">
<div id="choix">
<div id="choixlang">
<a href="../../../../Scratch/en/blog/2010-02-15-All-but-something-regexp" onclick="setLanguage('en')">
English </a>
</div>
<script type="text/javascript">//
document.write('<div id="switchcss"><a href="#">Changer de theme</a></div>');
//
</script>
<div class="tomenu"><a href="#navigation">↓ Menu ↓</a></div>
<div class="flush"></div>
</div>
</div>
<div id="titre">
<h1>Expression régulière pour tout sauf quelquechose</h1>
</div>
<div class="flush"></div>
<div id="afterheader" class="article">
<div class="corps">
<p>Parfois vous ne pouvez simplement pas écrire :</p>
<div>
<code class="ruby"> if str.match(regexp) and not str.match(other_regexp) do_something </code>
</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 :</p>
<div>
<p><code class="ruby"> # matcher toute les chaines qui # matchent bull (bullshit compris) /bull/</p>
<h1 id="matcher-toutes-les-chaines-qui">matcher toutes les chaines qui</h1>
<h1 id="contiennent-bull-sauf-bullshit">contiennent bull sauf bullshit</h1>
<p>/bull([^s]|<span class="math">)<em>b</em><em>u</em><em>l</em><em>l</em><em>s</em>([<sup><em>h</em></sup>]</span>)| bullsh([^i]|<span class="math">)<em>b</em><em>u</em><em>l</em><em>l</em><em>s</em><em>h</em><em>i</em>([<sup><em>t</em></sup>]</span>)/</p>
<h1 id="une-autre-façon-de-lécrire-serait">une autre façon de lécrire serait</h1>
/bull([^s]|<span class="math"><em>s</em>([<sup><em>h</em></sup>]</span>)|sh([^i]|<span class="math">)<em>s</em><em>h</em><em>i</em>([<sup><em>t</em></sup>]</span>))/ </code>
</div>
<p>Regardons de plus près. Dans la première ligne, lexpression 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 dune lettre différente de <code>s</code>.</p>
</blockquote>
<p>Et voilà. Jespère que ça a pu vous aider.</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 :
<div>
<code class="ruby"> # Commence avec a: ^a # Se finit par a: c$ # Contient b: .<em>b.</em> # Mais nest pas axbxc if str.match(/^a.<em>b.</em>c<span class="math">/)<em>a</em><em>n</em><em>d</em><em>n</em><em>o</em><em>t</em><em>s</em><em>t</em><em>r</em>.<em>m</em><em>a</em><em>t</em><em>c</em><em>h</em>(/<sup><em>a</em></sup><em>x</em><em>b</em><em>x</em><em>c</em></span>/) do_something end </code>
</div>
<p>Une solution est :</p>
<div>
<code class="ruby"> /abc| # longueur 3 a.bc| # longueur 4 ab.c| a[^x]b[^x]c| # longueur 5 a…<em>b.</em>c| # longueur &gt;5 a.<em>b…</em>c/ </code>
</div>
<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>
<hr />
<p><small><a name="note1"></a> Il peut être démontré que tout ensemble régulier privé dun ensemble fini est aussi régulier. </small></p>
</div>
<div id="social">
<a target="_blank" href="http://feeds.feedburner.com/yannespositocomfr" class="social">r</a>
·
<a target="_blank" href="https://twitter.com/home?status=http://yannesposito.com/Scratch/fr/blog/2010-02-15-All-but-something-regexp/index.html%22via%22@yogsototh" class="social">t</a>
·
<a target="_blank" href="http://www.facebook.com/sharer/sharer.php?u=/Scratch/fr/blog/2010-02-15-All-but-something-regexp" class="social">`</a>
·
<a target="_blank" href="https://plus.google.com/share?url=http://yannesposito.com/Scratch/fr/blog/2010-02-15-All-but-something-regexp" class="social">g</a>
<br />
<a class="message" href="../../../../Scratch/fr/blog/Social-link-the-right-way/">Ces liens sociaux préservent votre vie privée</a>
</div>
<div id="navigation">
<a href="../../../../">Home</a>
<span class="sep">¦</span>
<a href="../../../../Scratch/fr/blog">Blog</a>
<span class="sep">¦</span>
<a href="../../../../Scratch/fr/softwares">Softwares</a>
<span class="sep">¦</span>
<a href="../../../../Scratch/fr/about">About</a>
</div>
<div id="totop"><a href="#header">↑ Top ↑</a></div>
<div class="corps" id="comment">
<h2 class="first">Comments</h2>
<div id="disqus_thread"></div>
<script type="text/javascript">
/* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
var disqus_shortname = 'yannesposito'; // required: replace example with your forum shortname
/* * * DON'T EDIT BELOW THIS LINE * * */
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = 'http://' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
<a href="http://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>
</div>
<div class="tomenu"><a href="#navigation">↑ Menu ↑</a></div>
<div id="bottom">
<div>
Published on 2010-02-15
</div>
<div>
<a href="https://twitter.com/yogsototh">Follow @yogsototh</a>
</div>
<div>
Yann Esposito©
</div>
<div>
Done with
<a href="http://www.vim.org">Vim</a>
<span class="nicer">&amp;</span>
<a href="http://jaspervdj.be/hakyll">Hakyll</a>
</div>
</div>
</div>
</div>
</body>
<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>
<script type="text/javascript" src="../../../../Scratch/js/highlight/highlight.pack.js"></script>
<script type="text/javascript" src="../../../../Scratch/js/article.js"></script>
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
</html>