samhuri.net/wayback/@done/There's nothing regular about regular expressions - samhuri.net.html

539 lines
No EOL
30 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- saved from url=(0134)http://sami.samhuri.net/articles/2006/06/10/theres-nothing-regular-about-regular-expressions -->
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>There's nothing regular about regular expressions - samhuri.net</title>
<meta content="48.472,-123.3683" name="ICBM">
<link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://sami.samhuri.net/xml/rsd">
<link rel="alternate" type="application/rss+xml" title="RSS" href="http://sami.samhuri.net/xml/rss20/article/425/feed.xml">
<link rel="alternate" type="application/atom+xml" title="Atom" href="http://sami.samhuri.net/xml/atom10/article/425/feed.xml">
<script src="./There's nothing regular about regular expressions - samhuri.net_files/cookies.js" type="text/javascript"></script>
<script src="./There's nothing regular about regular expressions - samhuri.net_files/prototype.js" type="text/javascript"></script>
<script src="./There's nothing regular about regular expressions - samhuri.net_files/effects.js" type="text/javascript"></script>
<script src="./There's nothing regular about regular expressions - samhuri.net_files/typo.js" type="text/javascript"></script>
<script type="text/javascript"></script>
<link href="./There's nothing regular about regular expressions - samhuri.net_files/island.css" media="all" rel="Stylesheet" type="text/css">
<link href="./There's nothing regular about regular expressions - samhuri.net_files/user-styles.css" media="all" rel="Stylesheet" type="text/css">
<link href="./There's nothing regular about regular expressions - samhuri.net_files/print.css" media="print" rel="Stylesheet" type="text/css">
<style type="text/css" style="display: none !important;">object:not([type]),object[classid$=":D27CDB6E-AE6D-11cf-96B8-444553540000"],object[classid$=":d27cdb6e-ae6d-11cf-96b8-444553540000"],object[codebase*="swflash.cab"],object[data*=".swf"],object[type="application/x-shockwave-flash"],object[src*=".swf"],object[codetype="application/x-shockwave-flash"],embed[type="application/x-shockwave-flash"],embed[src*=".swf"],embed[allowscriptaccess],embed[flashvars],embed[wmode],object[classid$=":166B1BCA-3F9C-11CF-8075-444553540000"],object[codebase*="sw.cab"],object[data*=".dcr"],object[type="application/x-director"],object[src*=".dcr"],embed[type="application/x-director"],embed[src*=".dcr"],object[classid$=":15B782AF-55D8-11D1-B477-006097098764"],object[codebase*="awswaxf.cab"],object[data*=".aam"],object[type="application/x-authorware-map"],object[src*=".aam"],embed[type="application/x-authorware-map"],embed[src*=".aam"],object[classid$="32C73088-76AE-40F7-AC40-81F62CB2C1DA"],object[type="application/ag-plugin"],object[type="application/x-silverlight"],object[type="application/x-silverlight-2"],object[source*=".xaml"],object[sourceelement*="xaml"],embed[type="application/ag-plugin"],embed[source*=".xaml"]{display: none !important;}</style></head>
<body><div id="wm-ipp" style="position: relative; padding-top: 0px; padding-right: 5px; padding-bottom: 0px; padding-left: 5px; min-height: 70px; min-width: 800px; z-index: 9000; display: block; ">
<div id="wm-ipp-inside" style="position:fixed;padding:0!important;margin:0!important;width:97%;min-width:780px;border:5px solid #000;border-top:none;background-image:url(http://staticweb.archive.org/images/toolbar/wm_tb_bk_trns.png);text-align:center;-moz-box-shadow:1px 1px 3px #333;-webkit-box-shadow:1px 1px 3px #333;box-shadow:1px 1px 3px #333;font-size:11px!important;font-family:&#39;Lucida Grande&#39;,&#39;Arial&#39;,sans-serif!important;">
<table style="border-collapse:collapse;margin:0;padding:0;width:100%;"><tbody><tr>
<td style="padding:10px;vertical-align:top;min-width:110px;">
<a href="http://wayback.archive.org/web/" title="Wayback Machine home page" style="background-color:transparent;border:none;"><img src="./There's nothing regular about regular expressions - samhuri.net_files/wayback-toolbar-logo.png" alt="Wayback Machine" width="110" height="39" border="0"></a>
</td>
<td style="padding:0!important;text-align:center;vertical-align:top;width:100%;">
<table style="border-collapse:collapse;margin:0 auto;padding:0;width:570px;"><tbody><tr>
<td style="padding:3px 0;" colspan="2">
<form target="_top" method="get" action="http://wayback.archive.org/web/form-submit.jsp" name="wmtb" id="wmtb" style="margin:0!important;padding:0!important;"><input type="text" name="url" id="wmtbURL" value="http://sami.samhuri.net/articles/2006/06/10/theres-nothing-regular-about-regular-expressions" style="width:400px;font-size:11px;font-family:&#39;Lucida Grande&#39;,&#39;Arial&#39;,sans-serif;" onfocus="javascript:this.focus();this.select();"><input type="hidden" name="type" value="replay"><input type="hidden" name="date" value="20061018215138"><input type="submit" value="Go" style="font-size:11px;font-family:&#39;Lucida Grande&#39;,&#39;Arial&#39;,sans-serif;margin-left:5px;"><span id="wm_tb_options" style="display:block;"></span></form>
</td>
<td style="vertical-align:bottom;padding:5px 0 0 0!important;" rowspan="2">
<table style="border-collapse:collapse;width:110px;color:#99a;font-family:&#39;Helvetica&#39;,&#39;Lucida Grande&#39;,&#39;Arial&#39;,sans-serif;"><tbody>
<!-- NEXT/PREV MONTH NAV AND MONTH INDICATOR -->
<tr style="width:110px;height:16px;font-size:10px!important;">
<td style="padding-right:9px;font-size:11px!important;font-weight:bold;text-transform:uppercase;text-align:right;white-space:nowrap;overflow:visible;" nowrap="nowrap">
Sep
</td>
<td id="displayMonthEl" style="background:#000;color:#ff0;font-size:11px!important;font-weight:bold;text-transform:uppercase;width:34px;height:15px;padding-top:1px;text-align:center;" title="You are here: 21:51:38 Oct 18, 2006">OCT</td>
<td style="padding-left:9px;font-size:11px!important;font-weight:bold;text-transform:uppercase;white-space:nowrap;overflow:visible;" nowrap="nowrap">
<a href="http://sami.samhuri.net/articles/2006/06/10/theres-nothing-regular-about-regular-expressions" style="text-decoration:none;color:#33f;font-weight:bold;background-color:transparent;border:none;" title="29 Dec 2006"><strong>DEC</strong></a>
</td>
</tr>
<!-- NEXT/PREV CAPTURE NAV AND DAY OF MONTH INDICATOR -->
<tr>
<td style="padding-right:9px;white-space:nowrap;overflow:visible;text-align:right!important;vertical-align:middle!important;" nowrap="nowrap">
<img src="./There's nothing regular about regular expressions - samhuri.net_files/wm_tb_prv_off.png" alt="Previous capture" width="14" height="16" border="0">
</td>
<td id="displayDayEl" style="background:#000;color:#ff0;width:34px;height:24px;padding:2px 0 0 0;text-align:center;font-size:24px;font-weight: bold;" title="You are here: 21:51:38 Oct 18, 2006">18</td>
<td style="padding-left:9px;white-space:nowrap;overflow:visible;text-align:left!important;vertical-align:middle!important;" nowrap="nowrap">
<a href="http://sami.samhuri.net/articles/2006/06/10/theres-nothing-regular-about-regular-expressions" title="15:40:09 Dec 29, 2006" style="background-color:transparent;border:none;"><img src="./There's nothing regular about regular expressions - samhuri.net_files/wm_tb_nxt_on.png" alt="Next capture" width="14" height="16" border="0"></a>
</td>
</tr>
<!-- NEXT/PREV YEAR NAV AND YEAR INDICATOR -->
<tr style="width:110px;height:13px;font-size:9px!important;">
<td style="padding-right:9px;font-size:11px!important;font-weight: bold;text-align:right;white-space:nowrap;overflow:visible;" nowrap="nowrap">
2005
</td>
<td id="displayYearEl" style="background:#000;color:#ff0;font-size:11px!important;font-weight: bold;padding-top:1px;width:34px;height:13px;text-align:center;" title="You are here: 21:51:38 Oct 18, 2006">2006</td>
<td style="padding-left:9px;font-size:11px!important;font-weight: bold;white-space:nowrap;overflow:visible;" nowrap="nowrap">
2007
</td>
</tr>
</tbody></table>
</td>
</tr>
<tr>
<td style="vertical-align:middle;padding:0!important;">
<a href="http://wayback.archive.org/web/20061018215138*/http://sami.samhuri.net/articles/2006/06/10/theres-nothing-regular-about-regular-expressions" style="color:#33f;font-size:11px;font-weight:bold;background-color:transparent;border:none;" title="See a list of every capture for this URL"><strong>8 captures</strong></a>
<div style="margin:0!important;padding:0!important;color:#666;font-size:9px;padding-top:2px!important;white-space:nowrap;" title="Timespan for captures of this URL">18 Oct 06 - 9 Oct 07</div>
</td>
<td style="padding:0!important;">
<a style="position:relative; white-space:nowrap; width:400px;height:27px;" href="" id="wm-graph-anchor">
<div id="wm-ipp-sparkline" style="position:relative; white-space:nowrap; width:400px;height:27px;background-color:#fff;cursor:pointer;border-right:1px solid #ccc;" title="Explore captures for this URL">
<img id="sparklineImgId" style="position:absolute; z-index:9012; top:0px; left:0px;" onmouseover="showTrackers(&#39;inline&#39;);" onmouseout="showTrackers(&#39;none&#39;);" onmousemove="trackMouseMove(event,this)" alt="sparklines" width="400" height="27" border="0" src="./There's nothing regular about regular expressions - samhuri.net_files/graph.jsp">
<img id="wbMouseTrackYearImg" style="display:none; position:absolute; z-index:9010;" width="25" height="27" border="0" src="./There's nothing regular about regular expressions - samhuri.net_files/transp-yellow-pixel.png">
<img id="wbMouseTrackMonthImg" style="display:none; position:absolute; z-index:9011; " width="2" height="27" border="0" src="./There's nothing regular about regular expressions - samhuri.net_files/transp-red-pixel.png">
</div>
</a>
</td>
</tr></tbody></table>
</td>
<td style="text-align:right;padding:5px;width:65px;font-size:11px!important;">
<a href="javascript:;" onclick="document.getElementById(&#39;wm-ipp&#39;).style.display=&#39;none&#39;;" style="display:block;padding-right:18px;background:url(http://staticweb.archive.org/images/toolbar/wm_tb_close.png) no-repeat 100% 0;color:#33f;font-family:&#39;Lucida Grande&#39;,&#39;Arial&#39;,sans-serif;margin-bottom:23px;background-color:transparent;border:none;" title="Close the toolbar">Close</a>
<a href="http://faq.web.archive.org/" style="display:block;padding-right:18px;background:url(http://staticweb.archive.org/images/toolbar/wm_tb_help.png) no-repeat 100% 0;color:#33f;font-family:&#39;Lucida Grande&#39;,&#39;Arial&#39;,sans-serif;background-color:transparent;border:none;" title="Get some help using the Wayback Machine">Help</a>
</td>
</tr></tbody></table>
</div>
</div>
<!-- BEGIN WAYBACK TOOLBAR INSERT -->
<script type="text/javascript" src="./There's nothing regular about regular expressions - samhuri.net_files/disclaim-element.js"></script>
<script type="text/javascript" src="./There's nothing regular about regular expressions - samhuri.net_files/graph-calc.js"></script>
<script type="text/javascript" src="./There's nothing regular about regular expressions - samhuri.net_files/jquery.min.js"></script>
<script type="text/javascript">
//<![CDATA[
var firstDate = 820454400000;
var lastDate = 1325375999999;
var wbPrefix = "http://web.archive.org/web/";
var wbCurrentUrl = "http://sami.samhuri.net/articles/2006/06/10/theres-nothing-regular-about-regular-expressions";
var curYear = -1;
var curMonth = -1;
var yearCount = 16;
var firstYear = 1996;
var imgWidth=400;
var yearImgWidth = 25;
var monthImgWidth = 2;
var trackerVal = "none";
var displayDay = "18";
var displayMonth = "Oct";
var displayYear = "2006";
var prettyMonths = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
function showTrackers(val) {
if(val == trackerVal) {
return;
}
if(val == "inline") {
document.getElementById("displayYearEl").style.color = "#ec008c";
document.getElementById("displayMonthEl").style.color = "#ec008c";
document.getElementById("displayDayEl").style.color = "#ec008c";
} else {
document.getElementById("displayYearEl").innerHTML = displayYear;
document.getElementById("displayYearEl").style.color = "#ff0";
document.getElementById("displayMonthEl").innerHTML = displayMonth;
document.getElementById("displayMonthEl").style.color = "#ff0";
document.getElementById("displayDayEl").innerHTML = displayDay;
document.getElementById("displayDayEl").style.color = "#ff0";
}
document.getElementById("wbMouseTrackYearImg").style.display = val;
document.getElementById("wbMouseTrackMonthImg").style.display = val;
trackerVal = val;
}
function getElementX2(obj) {
var thing = jQuery(obj);
if((thing == undefined)
|| (typeof thing == "undefined")
|| (typeof thing.offset == "undefined")) {
return getElementX(obj);
}
return Math.round(thing.offset().left);
}
function trackMouseMove(event,element) {
var eventX = getEventX(event);
var elementX = getElementX2(element);
var xOff = eventX - elementX;
if(xOff < 0) {
xOff = 0;
} else if(xOff > imgWidth) {
xOff = imgWidth;
}
var monthOff = xOff % yearImgWidth;
var year = Math.floor(xOff / yearImgWidth);
var yearStart = year * yearImgWidth;
var monthOfYear = Math.floor(monthOff / monthImgWidth);
if(monthOfYear > 11) {
monthOfYear = 11;
}
// 1 extra border pixel at the left edge of the year:
var month = (year * 12) + monthOfYear;
var day = 1;
if(monthOff % 2 == 1) {
day = 15;
}
var dateString =
zeroPad(year + firstYear) +
zeroPad(monthOfYear+1,2) +
zeroPad(day,2) + "000000";
var monthString = prettyMonths[monthOfYear];
document.getElementById("displayYearEl").innerHTML = year + 1996;
document.getElementById("displayMonthEl").innerHTML = monthString;
// looks too jarring when it changes..
//document.getElementById("displayDayEl").innerHTML = zeroPad(day,2);
var url = wbPrefix + dateString + '/' + wbCurrentUrl;
document.getElementById('wm-graph-anchor').href = url;
//document.getElementById("wmtbURL").value="evX("+eventX+") elX("+elementX+") xO("+xOff+") y("+year+") m("+month+") monthOff("+monthOff+") DS("+dateString+") Moy("+monthOfYear+") ms("+monthString+")";
if(curYear != year) {
var yrOff = year * yearImgWidth;
document.getElementById("wbMouseTrackYearImg").style.left = yrOff + "px";
curYear = year;
}
if(curMonth != month) {
var mtOff = year + (month * monthImgWidth) + 1;
document.getElementById("wbMouseTrackMonthImg").style.left = mtOff + "px";
curMonth = month;
}
}
//]]>
</script>
<style type="text/css">body{margin-top:0!important;padding-top:0!important;min-width:800px!important;}#wm-ipp a:hover{text-decoration:underline!important;}</style>
<script type="text/javascript">
var wmDisclaimBanner = document.getElementById("wm-ipp");
if(wmDisclaimBanner != null) {
disclaimElement(wmDisclaimBanner);
}
</script>
<!-- END WAYBACK TOOLBAR INSERT -->
<div id="content" class="clearfix">
<div id="main">
<!--
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<rdf:Description
rdf:about=""
trackback:ping="http://sami.samhuri.net/articles/trackback/425"
dc:title="There's nothing regular about regular expressions"
dc:identifier="http://sami.samhuri.net/articles/read/425"
dc:description="I&amp;#8217;m almost half way reading Jeffrey Friedl&amp;#8217;s book Mastering Regular Expressions and I have to say that for a book on something that could potentially bore you to tears, he really does an e"
dc:creator="sjs"
dc:date="2006-09-19T19:20:46-07:00" />
</rdf:RDF>
-->
<div class="post" onmouseover="if (getCookie(&#39;is_admin&#39;) == &#39;yes&#39;) { Element.show(&#39;admin_article&#39;); }" onmouseout="Element.hide(&#39;admin_article&#39;);">
<a href="http://sami.samhuri.net/admin/content/edit/425" class="admintools" id="admin_article" style="display: none">edit</a>
<h2>There's nothing regular about regular expressions</h2>
<p class="auth"><!-- Posted by <a href="mailto:sjs@uvic.ca">Sami Jensen Samhuri</a> -->
<span class="typo_date" title="Sat, 10 Jun 2006 08:28:00 GMT">on Saturday, June 10, 2006</span></p>
<p>I'm almost half way reading Jeffrey Friedl's book <a href="http://www.oreilly.com/catalog/regex2/">Mastering Regular Expressions</a> and I have to say that for a book on something that could potentially bore you to tears, he really does an excellent job of keeping it interesting. Even though a lot of the examples are contrived (I'm sure out of necessity), he also uses real examples of regexes that he's actually used at <a href="http://www.yahoo.com/">Yahoo!</a>.</p><p>As someone who has to know how everything works it's also an excellent lesson in patience, as he frequently says "here, take this knowledge and just accept it for now until I can explain why in the next chapter (or in 3 chapters!)". But it's all with good reason and when he does explain he does it well.</p>
<p>Reading about the different NFA and DFA engines and which tools use which made me go "ahhh, /that's/ why I can't do that in grep!" It's not just that I like to know how things work either, he's 100% correct about having to know information like that to wield the power of regexes in all situations. This book made me realize that regex implementations can be wildly different and that you really need to consider the job before jumping into using a specific regex flavour, as he calls them. I'm fascinated by learning why DFA regex implementations would successfully allow <tt>^\w+=.<strong>(\\\n.</strong>)*</tt> to match certain lines, allowing for trailing backslashes to mean continuation but why NFA engines would fail to do the same without tweaking it a bit.</p>
<p>It requires more thinking than the last 2 computer books I read, "Programming Ruby": (the "pixaxe" book) and <a href="http://sami.samhuri.net/articles/2006/06/10/,">Agile Web Development With Rails</a> so it's noticeably slower reading. It's also the kind of book I will read more than once, for sure. There's just no way I can glean everything from it in one reading. If you use regular expressions at all then you need this book. This is starting to sound like an advertisement so I'll say no more.</p>
QOTD, p. 329, about matching nested pairs of parens:
<pre>\(([^()]|\(([^()]|\(([^()]|\(([^()])*\))*\))*\))*\)
Wow, that's ugly.
</pre>
<p>(Don't worry, there's a much better solution on the next 2 pages after that quote.)</p>
</div>
<p class="meta">
Posted in <a href="http://sami.samhuri.net/articles/category/technology" rel="tag">technology</a>&nbsp;<strong>|</strong>&nbsp;Tags <a href="http://sami.samhuri.net/articles/tag/book" rel="tag">book</a>, <a href="http://sami.samhuri.net/articles/tag/regex" rel="tag">regex</a>&nbsp;<strong>|</strong>&nbsp;<a href="http://sami.samhuri.net/articles/2006/06/10/theres-nothing-regular-about-regular-expressions#comments">no comments</a>&nbsp;<strong>|</strong>&nbsp;<a href="http://sami.samhuri.net/articles/2006/06/10/theres-nothing-regular-about-regular-expressions#trackbacks">no trackbacks</a>
</p>
<a name="comments"></a><h4 class="blueblk">Comments</h4>
<p class="postmetadata alt">
<small><a href="http://sami.samhuri.net/articles/2006/06/10/theres-nothing-regular-about-regular-expressions#respond">Leave a response</a></small>
</p>
<ol class="comment-list" id="commentList">
<li id="dummy_comment" style="display: none"></li>
</ol>
<a name="trackbacks"></a><h4 class="blueblk">Trackbacks</h4>
<p>
Use the following link to trackback from your own site:<br>
<span class="light-bg">http://sami.samhuri.net/articles/trackback/425</span>
</p>
<p class="postmetadata alt">
<small>
<a href="http://sami.samhuri.net/xml/rss20/article/425/feed.xml" title="RSS Feed">RSS feed for this post</a>
<a href="http://sami.samhuri.net/articles/trackback/425">trackback uri</a>
</small>
</p>
<form action="http://sami.samhuri.net/articles/comment/425" class="commentform" id="commentform" method="post" onsubmit="new Ajax.Updater({success:&#39;commentList&#39;}, &#39;/articles/comment/425&#39;, {asynchronous:true, evalScripts:true, insertion:Insertion.Bottom, onComplete:function(request){complete(request)}, onFailure:function(request){failure(request)}, onLoading:function(request){loading()}, parameters:Form.serialize(this)}); return false;">
<div class="comment-box">
<div id="errors"></div>
<div id="preview" style="display: none"></div>
<a name="respond"></a>
<table cellpadding="4" cellspacing="0" class="frm-tbl">
<tbody><tr>
<td><p><label for="comment_author">Your name</label></p></td>
<td> <input id="comment_author" name="comment[author]" size="20" type="text"> <small><a href="http://sami.samhuri.net/articles/2006/06/10/theres-nothing-regular-about-regular-expressions#" onclick="Element.toggle(&#39;guest_url&#39;); Element.toggle(&#39;guest_email&#39;); return false;">(leave url/email »)</a></small></td>
</tr>
<tr id="guest_url" style="display:none;">
<td><p><label for="comment_url">Your blog</label></p></td>
<td> <input id="comment_url" name="comment[url]" size="30" type="text"></td>
</tr>
<tr id="guest_email" style="display:none;">
<td><p><label for="comment_email">Your email</label></p></td>
<td> <input id="comment_email" name="comment[email]" size="30" type="text"></td>
</tr>
<tr>
<td><p><label for="comment_body">Your message</label></p></td>
<td valign="top" colspan="2">
<textarea cols="40" id="comment_body" name="comment[body]" rows="20"></textarea>
</td>
</tr>
<tr>
<td colspan="2" id="frm-btns">
<span id="comment_loading" style="display:none;"><img alt="Spinner" src="./There's nothing regular about regular expressions - samhuri.net_files/spinner.gif"></span>&nbsp;&nbsp;
<a href="http://sami.samhuri.net/articles/2006/06/10/theres-nothing-regular-about-regular-expressions#" onclick="new Ajax.Updater(&#39;preview&#39;, &#39;/articles/comment_preview&#39;, {asynchronous:true, evalScripts:true, parameters:Form.serialize(&#39;commentform&#39;), onComplete:function(request){Element.show(&#39;preview&#39;)}}); return false;">Preview comment</a>
<input type="submit" name="submit" id="form-submit-button" value="submit" class="button">
</td>
</tr>
</tbody></table>
</div>
</form>
<script type="text/javascript">
//<![CDATA[
show_dates_as_local_time()
//]]>
</script>
</div>
</div>
<div id="leftcolumn">
<div id="header">
<h1 id="sitename"><a href="http://sami.samhuri.net/">sjs</a></h1>
<h2 id="subtitle">&nbsp;</h2>
</div>
<div id="sidebar">
<div id="search"><form action="http://sami.samhuri.net/articles/search" id="sform" method="get">
<label for="q">Search: </label><input type="text" id="q" name="q" value="" size="15">
<img alt="Spinner-blue" id="search_spinner" src="./There's nothing regular about regular expressions - samhuri.net_files/spinner-blue.gif" style="display:none;">
</form>
<script type="text/javascript">
//<![CDATA[
new Form.Element.Observer('q', 1, function(element, value) {new Ajax.Updater('search-results', '/live/search', {asynchronous:true, evalScripts:true, onComplete:function(request){Element.hide('search_spinner')}, onLoading:function(request){Element.show('search_spinner')}, parameters:'q=' + escape($F('q'))})})
//]]>
</script></div>
<div id="search-results"></div>
<div class="sidebar-node">
<h3>All about...</h3>
<ul>
<li><a href="http://sami.samhuri.net/pages/about">a bit about me</a></li>
<li><a href="http://sami.samhuri.net/pages/thunder">workstation</a></li>
</ul>
</div>
<div class="sidebar-node">
<h3>Categories</h3>
<ul id="categories">
<li><a href="http://sami.samhuri.net/articles/category/amusement">amusement</a> <em>(5)</em></li>
<li><a href="http://sami.samhuri.net/articles/category/gentoo">gentoo</a> <em>(1)</em></li>
<li><a href="http://sami.samhuri.net/articles/category/hacking">coding</a> <em>(16)</em></li>
<li><a href="http://sami.samhuri.net/articles/category/life">life</a> <em>(5)</em></li>
<li><a href="http://sami.samhuri.net/articles/category/linux">linux</a> <em>(2)</em></li>
<li><a href="http://sami.samhuri.net/articles/category/mac-os-x">mac os x</a> <em>(6)</em></li>
<li><a href="http://sami.samhuri.net/articles/category/python">python</a> <em>(1)</em></li>
<li><a href="http://sami.samhuri.net/articles/category/rails">rails</a> <em>(12)</em></li>
<li><a href="http://sami.samhuri.net/articles/category/ruby">ruby</a> <em>(1)</em></li>
<li><a href="http://sami.samhuri.net/articles/category/technology">technology</a> <em>(5)</em></li>
<li><a href="http://sami.samhuri.net/articles/category/textmate">textmate</a> <em>(10)</em></li>
<li><a href="http://sami.samhuri.net/articles/category/apple">apple</a> <em>(6)</em></li>
<li><a href="http://sami.samhuri.net/articles/category/php">php</a> <em>(4)</em></li>
</ul>
</div>
<div class="sidebar-node">
<h3>Archives</h3>
<ul id="archives">
<li>
<a href="http://sami.samhuri.net/articles/2006/09">September 2006</a>
<em>(2)</em>
</li>
<li>
<a href="http://sami.samhuri.net/articles/2006/08">August 2006</a>
<em>(1)</em>
</li>
<li>
<a href="http://sami.samhuri.net/articles/2006/07">July 2006</a>
<em>(5)</em>
</li>
<li>
<a href="http://sami.samhuri.net/articles/2006/06">June 2006</a>
<em>(4)</em>
</li>
<li>
<a href="http://sami.samhuri.net/articles/2006/05">May 2006</a>
<em>(2)</em>
</li>
<li>
<a href="http://sami.samhuri.net/articles/2006/04">April 2006</a>
<em>(1)</em>
</li>
<li>
<a href="http://sami.samhuri.net/articles/2006/03">March 2006</a>
<em>(4)</em>
</li>
<li>
<a href="http://sami.samhuri.net/articles/2006/02">February 2006</a>
<em>(15)</em>
</li>
</ul>
</div>
<div class="sidebar-node">
<h3>Links</h3>
<ul>
<li><a href="http://phox.ca/cswiki/Main_Page">CSWiki</a></li>
<li><a href="http://jim.roepcke.com/">Have Browser, Will Travel</a></li>
<li><a href="http://blog.inquirylabs.com/">Going Up</a></li>
<li><a href="http://www.mirage.org/">encieno</a></li>
<li><a href="http://www.nofxwiki.net/">nofxwiki.net</a></li>
<li>sami at samhuri dot net</li>
</ul>
</div>
<div class="sidebar-node">
<p></p><ul>
<li><a class="feed" href="http://sami.samhuri.net/xml/rss20/feed.xml" title="Articles feed"><img src="./There's nothing regular about regular expressions - samhuri.net_files/feed-icon-48x48.png" alt="RSS 2.0" width="48" height="48"></a></li>
<!--
-->
</ul><p></p>
</div>
<br clear="all">
</div>
</div>
<div id="footer">
<ul>
<li><a href="http://typo.leetsoft.com/">Typo</a></li>
<li></li>
<li><a href="http://validator.w3.org/check?uri=referer">Valid XHTML</a></li>
<li></li>
<li><a href="http://jigsaw.w3.org/css-validator/validator?uri=http://sami.samhuri.net/">Valid CSS</a></li>
</ul>
</div>
<script src="./There's nothing regular about regular expressions - samhuri.net_files/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-214054-3";
urchinTracker();
</script>
<!--
FILE ARCHIVED ON 21:51:38 Oct 18, 2006 AND RETRIEVED FROM THE
INTERNET ARCHIVE ON 2:51:04 Aug 21, 2011.
JAVASCRIPT APPENDED BY WAYBACK MACHINE, COPYRIGHT INTERNET ARCHIVE.
ALL OTHER CONTENT MAY ALSO BE PROTECTED BY COPYRIGHT (17 U.S.C.
SECTION 108(a)(3)).
-->
<div id="footnotify_lightbox" style="position: fixed; width: 100%; height: 100%; top: 0px; left: 0px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgba(0, 0, 0, 0.699219); display: none; background-position: initial initial; background-repeat: initial initial; "></div><div id="footnotify_holder" style="position: absolute; display: none; "><div id="footnotify_arrow" style="letter-spacing: -1px; width: 32px; margin-top: 0px; margin-right: -11px; margin-bottom: 0px; margin-left: -11px; text-align: center; font-size: 13px; padding-top: 2em; line-height: 0.9em; color: rgb(0, 0, 0); ">◢◣</div><div id="footnotify_panel" style="padding-top: 1px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; margin-top: 0px; margin-right: -240px; margin-bottom: 0px; margin-left: -240px; width: 480px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(0, 0, 0); color: inherit; background-position: initial initial; background-repeat: initial initial; "><div id="footnotify_content" style="margin-top: 2em; margin-right: 2em; margin-bottom: 2em; margin-left: 2em; "></div></div></div><div id="footnotify_notification" style="position: fixed; top: 5px; left: 5px; z-index: 999; padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; color: rgb(255, 255, 255); background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgba(0, 0, 0, 0.699219); display: none; background-position: initial initial; background-repeat: initial initial; "></div></body></html>