<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Cyril - Mes astuces &#187; regexps</title>
	<atom:link href="http://blog.cyril.me/tag/regexps/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.cyril.me</link>
	<description>Yet Another Wordpress Blog</description>
	<lastBuildDate>Tue, 31 Aug 2010 06:51:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Expressions régulières : combiner match et non-match</title>
		<link>http://blog.cyril.me/2010/06/expressions-regulieres-combiner-match-non-match/</link>
		<comments>http://blog.cyril.me/2010/06/expressions-regulieres-combiner-match-non-match/#comments</comments>
		<pubDate>Sun, 13 Jun 2010 20:12:05 +0000</pubDate>
		<dc:creator>Cyril</dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[regexps]]></category>

		<guid isPermaLink="false">http://blog.cyril.me/?p=289</guid>
		<description><![CDATA[Match et non-match&#8230; En cette période de coupe du monde de football 2010, quoi de plus naturel que de parler de match ? &#8230; Hum. Problématique Mon problème aujourd&#8217;hui, c&#8217;est de sélectionner les listes qui contiennent une certaines expression régulière, mais pas une autre. Plus exactement, et pour faire dans les anglicismes, je cherche &#171;&#160;foo.*&#160;&#187;, [...]]]></description>
			<content:encoded><![CDATA[<h3>Match et non-match&#8230;</h3>
<p>En cette période de <a title="Allez les bleus !" href="http://fr.fifa.com/">coupe du monde de football 2010</a>, quoi de plus naturel que de parler de match ? &#8230; Hum.</p>
<h3>Problématique</h3>
<p>Mon problème aujourd&#8217;hui, c&#8217;est de sélectionner les listes qui contiennent une certaines expression régulière, mais pas une autre. Plus exactement, et pour faire dans les anglicismes, je cherche &laquo;&nbsp;foo.*&nbsp;&raquo;, mais pas &laquo;&nbsp;foobar&nbsp;&raquo;.</p>
<h3>La solution</h3>
<p>Il faut utiliser la forme suivante : <code>(?!regexp)</code> pour choisir quelque chose qui ne match pas la <code>regexp</code> en question.</p>
<p>Mon exemple en pratique :</p>
<pre>$ echo -e 'foo\nfoobar\nfoofighting' | grep -P 'foo(?!bar)'
foo
foofighting</pre>
<p>Plus d&#8217;informations disponible avec <a title="Manuel des expressions régulières perl" href="http://perldoc.perl.org/perlre.html">perldoc perlre</a>, en particulier le chapitre sur les expressions régulières étendues (Extended Patterns)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cyril.me/2010/06/expressions-regulieres-combiner-match-non-match/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Expressions régulières : trouver un texte compris entre deux mots</title>
		<link>http://blog.cyril.me/2010/03/expressions-regulieres-regexp-texte-entre-deux-mots/</link>
		<comments>http://blog.cyril.me/2010/03/expressions-regulieres-regexp-texte-entre-deux-mots/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 17:04:23 +0000</pubDate>
		<dc:creator>Cyril</dc:creator>
				<category><![CDATA[web]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[regexps]]></category>

		<guid isPermaLink="false">http://blog.cyril.me/?p=199</guid>
		<description><![CDATA[Problème Lorsque l&#8217;on parse des fichiers, surtout les fichiers HTML, on a parfois besoin d&#8217;extraire un texte compris entre deux balises. Voici donc un moyen d&#8217;y parvenir avec les expressions régulières. Considérations techniques Je parlerais ici des expressions régulières perl (et par extension : grep -P et preg_* de php). Par défaut, un /.*/ ou [...]]]></description>
			<content:encoded><![CDATA[<h3>Problème</h3>
<p>Lorsque l&#8217;on parse des fichiers, surtout les fichiers HTML, on a parfois besoin d&#8217;extraire un texte compris entre deux balises. Voici donc un moyen d&#8217;y parvenir avec les expressions régulières.</p>
<h3>Considérations techniques</h3>
<p>Je parlerais ici des expressions régulières perl (et par extension : grep -P et preg_* de php).</p>
<p>Par défaut, un <code>/.*/</code> ou toute autre expression sera &laquo;&nbsp;gourmand&nbsp;&raquo; : ça matche tant que ça peut encore matcher. Par exemple, <code>/a*/</code> appliqué à la chaîne <code>"aaa"</code> va matcher <code>"aaa"</code>, et non pas <code>""</code>.</p>
<p>Dans mon cas pratique, j&#8217;ai une balise <code>&lt;td id="identifier"&gt;</code> et j&#8217;en cherche le contenu. Donc si la regexp utilisée est <code>/&lt;td id="identifier"&gt;(.*)&lt;\/td&gt;/</code> alors je vais matcher ce qu&#8217;il y a entre mon td ouvrant, et <strong>le dernier td fermant</strong>.</p>
<h3>La solution</h3>
<p>La solution consiste à dire au moteur d&#8217;expression régulière de prendre le moins possible, et ça se code comme suit : <code>/&lt;td id="identifier"&gt;(.*<strong>?</strong>)&lt;\/td&gt;/</code>.</p>
<p>Bibliographie : <a title="Regexp : match string between two words" href="http://social.msdn.microsoft.com/Forums/en-US/regexp/thread/ab975ba5-31dd-4e6d-b72f-5cd6bf374b02">http://social.msdn.microsoft.com/Forums/en-US/regexp/thread/ab975ba5-31dd-4e6d-b72f-5cd6bf374b02</a> (et oui, parfois on trouve des choses utiles sur les forums de microsoft).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cyril.me/2010/03/expressions-regulieres-regexp-texte-entre-deux-mots/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vérifier qu&#8217;une adresse correspond à un bon nom de domaine</title>
		<link>http://blog.cyril.me/2008/08/adresse_nom_de_domaine_perl_regexps/</link>
		<comments>http://blog.cyril.me/2008/08/adresse_nom_de_domaine_perl_regexps/#comments</comments>
		<pubDate>Thu, 07 Aug 2008 14:04:28 +0000</pubDate>
		<dc:creator>Cyril</dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[regexps]]></category>

		<guid isPermaLink="false">http://blog.cyril.me/?p=1</guid>
		<description><![CDATA[Premier article: comment matcher un nom de domaine avec une expression régulière sur une adresse web, ou bien comment vérifier qu&#8217;une adresse web est bien celle d&#8217;un nom de domaine spécifié. Alors voici l&#8217;expression régulière que je propose: ^https?://([^/]*\.)?\Qcyril.me\E(:\d+)?(\z&#124;/) Expications: ^ : permet de signifier que l&#8217;on commence au début de la chaine de caractères [...]]]></description>
			<content:encoded><![CDATA[<p>Premier article: comment matcher un nom de domaine avec une expression régulière sur une adresse web, ou bien comment vérifier qu&#8217;une adresse web est bien celle d&#8217;un nom de domaine spécifié.</p>
<p>Alors voici l&#8217;expression régulière que je propose:</p>
<pre>^https?://([^/]*\.)?\Qcyril.me\E(:\d+)?(\z|/)</pre>
<p>Expications:</p>
<ul>
<li>^ : permet de signifier que l&#8217;on commence au début de la chaine de caractères (on ne veut pas matcher une adresse du type (http://redir.org/?url=http://cyril.me/)</li>
<li>https? : on ne match que les protocoles web, soit http ou https</li>
<li>([^/]*\.)?\Qcyril.me\E : match toutes les possibilités de a.b.c.cyril.me, ou cyril.me tout court. L&#8217;important est qu&#8217;il n&#8217;y ai pas de &#8216;/&#8217; avant le cyril.me. Attention: le but n&#8217;est pas de vérifier la conformité d&#8217;une adresse web ou du nom de domaine, car on part du principe que l&#8217;adresse est valide. Le \Q permet de rechercher ce qui suit sans en interpréter la signification (en l&#8217;occurrence, ça permet de ne pas interpréter le &#8216;.&#8217; comme &laquo;&nbsp;n&#8217;importe quel caractère&nbsp;&raquo;). Le \E repasse en mode d&#8217;interprétation.</li>
<li>(:\d+)? : parfois, on est sur un port différent que le port standard, par exemple cyril.me:81 ou ou même sur le port normal cyril.me:80</li>
<li>(/|\z) : Soit tout ce qui précède est suivi par un &#8216;/&#8217;, puis suivent n&#8217;importent quels caractères qui ne nous intéressent pas, ou bien on match la fin de la chaine par \z.</li>
</ul>
<p>Voici un <a href="http://blog.cyril.me/wp-content/uploads/2008/08/regexptests.pl">petit code</a> qui permet de tester cette expression régulière sur plusieurs adresses (cf aussi <a href="http://blog.cyril.me/wp-utils/regexps/create_regexp">une page web pour faire des tests</a>):</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co1">#!/usr/bin/perl</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1"># Differentes regexps</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">@url</span> = <span class="br0">&#40;</span><span class="st0">&quot;http://cyril.me:80/abc&quot;</span>, <span class="st0">&quot;http://cyril.me/abc&quot;</span>, <span class="st0">&quot;https://www.cyril.me/abc&quot;</span>, <span class="st0">&quot;http://cyril.me&quot;</span>, <span class="st0">&quot;https://wwwcyril.me/abc&quot;</span>, <span class="st0">&quot;http://www.cyril.mercredi/&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1"># l&#8217;expression reguliere (attention aux echappements)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$r</span> = <span class="st0">&quot;^https?://([^/]+<span class="es0">\\</span>.)?cyril.me(:<span class="es0">\\</span>d+)?(/|<span class="es0">\\</span>z)&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">foreach</span> <span class="kw1">my</span> <span class="re0">$u</span> <span class="br0">&#40;</span><span class="re0">@url</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$u</span> =~ /<span class="re0">$r</span>/i<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;$u matches<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;$u not matches<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.cyril.me/2008/08/adresse_nom_de_domaine_perl_regexps/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
