<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
		>
<channel>
	<title>Comments on: Regular Expressions, Part 1</title>
	<atom:link href="http://programmingpraxis.com/2009/09/15/regular-expressions-part-1/feed/" rel="self" type="application/rss+xml" />
	<link>http://programmingpraxis.com/2009/09/15/regular-expressions-part-1/</link>
	<description>A collection of etudes, updated weekly, for the education and enjoyment of the savvy programmer</description>
	<lastBuildDate>Mon, 28 May 2012 03:30:45 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
	<item>
		<title>By: Vikas Tandi</title>
		<link>http://programmingpraxis.com/2009/09/15/regular-expressions-part-1/#comment-2890</link>
		<dc:creator><![CDATA[Vikas Tandi]]></dc:creator>
		<pubDate>Thu, 21 Apr 2011 12:51:13 +0000</pubDate>
		<guid isPermaLink="false">http://programmingpraxis.com/?p=1319#comment-2890</guid>
		<description><![CDATA[A scratchy and long implementation in C
[sourcecode lang=&quot;cpp&quot;]
#include &lt;stdio.h&gt;
#include &lt;ctype.h&gt;

static int copy_code(int code, char *s, int i);
static int copy_character(int c, char *s, int i);
static int copy_special_characters(int code, char *s, int i);

static char codes[][4] = {&quot;bol&quot;, &quot;eol&quot;, &quot;any&quot;, &quot;lit&quot;, &quot;ccl&quot;, &quot;ncl&quot;,	&quot;clo&quot;};
enum{ BOL = 0, EOL, ANY, LIT, CCL, NCL, CLO};

static char special_characters[][8] = {&quot;space&quot;, &quot;newline&quot;, &quot;tab&quot;};
enum{SPACE, NEWLINE, TAB};

enum{VALID_REGEXP = 0, INVALID_REGEXP};

int encode_regular_expression(char *regexp, char *encode)
{
	/* i is the index of current character in regexp ang j is the current character being output */
	int i, j, escaped;
	char c;

	i = j = escaped = 0;
	encode[j++] = &#039;(&#039;;
	/* parse through the regular expression */
	for(;;)
	{
		/* read the character in regexp in c */
		c = regexp[i++];

		if(c == &#039;&#092;&#048;&#039;)
			break;

		if(c == &#039;\\&#039;)								/* escape character */
		{
			escaped = 1;
			continue;
		}

		encode[j++] = &#039;(&#039;;

		if(!escaped &amp;&amp; c == &#039;^&#039; &amp;&amp; i == 1)					/* begining of line character &#039;^&#039; is not escaped and located at the start of regexp */
			j = copy_code(BOL, encode, j);
		else if(!escaped &amp;&amp; c == &#039;$&#039; &amp;&amp; regexp[i] == &#039;&#092;&#048;&#039;)		/* end of line character &#039;$&#039; is not escaped and located at the end of regexp */
			j = copy_code(EOL, encode, j);
		else if(!escaped &amp;&amp; c == &#039;.&#039;)							/* any character */
		{
			if(regexp[i] == &#039;*&#039;)
			{
				j = copy_code(CLO, encode, j);
				encode[j++] = &#039; &#039;;
				i++;
			}

			j = copy_code(ANY, encode, j);
		}
		else if(!escaped &amp;&amp; c == &#039;[&#039;)							/* begining of character class */
		{
			int k;

			/* check for closure and validity of character class */
			for(k = i; regexp[k] != &#039;&#092;&#048;&#039; &amp;&amp; regexp[k] != &#039;]&#039;; k++);

			/* if no ending bracket, return invalid regexp */
			if(regexp[k] == &#039;&#092;&#048;&#039;)
				return INVALID_REGEXP;

			/* check for closure */
			if(regexp[k+1] == &#039;*&#039;)
			{
				j = copy_code(CLO, encode, j);
				encode[j++] = &#039; &#039;;
			}

			/* check for negated character */
			if(regexp[i] == &#039;^&#039;)
			{
				j = copy_code(NCL, encode, j);
				i++;
			}
			else
				j = copy_code(CCL, encode, j);

			while(regexp[i] != &#039;&#092;&#048;&#039; &amp;&amp; regexp[i] != &#039;]&#039;)
			{
				char start, end;

				if(regexp[i+1] != &#039;-&#039;)
				{
					j = copy_character(regexp[i], encode, j);
					i++;
					continue;
				}

				if(!isalnum(regexp[i]) &amp;&amp; !isalnum(regexp[i+2]))
					return INVALID_REGEXP;

				if(isalpha(regexp[i])  &amp;&amp; !isalpha(regexp[i+2]))
					return INVALID_REGEXP;

				if(isdigit(regexp[i])  &amp;&amp; !isdigit(regexp[i+2]))
					return INVALID_REGEXP;

				if(regexp[i] &gt; regexp[i+2])
					return INVALID_REGEXP;

				/*now expand the given range */
				for(start = regexp[i], end = regexp[i+2]; start &lt;= end; start++)
					j = copy_character(start, encode, j);

				i = i + 3;
			}

			i++;
			if(regexp[i] == &#039;*&#039;)
				i++;
		}
		else							/* literal character */
		{
			if(regexp[i] == &#039;*&#039;)
			{
				j = copy_code(CLO, encode, j);
				encode[j++] = &#039; &#039;;
				i++;
			}

			j = copy_code(LIT, encode, j);

			/* handle special characters */
			if(escaped &amp;&amp; c == &#039;n&#039;)
				j = copy_special_characters(NEWLINE, encode, j);
			else if(escaped &amp;&amp; c == &#039;t&#039;)
				j = copy_special_characters(TAB, encode, j);
			else if(c == &#039; &#039;)
				j = copy_special_characters(SPACE, encode, j);
			else
				j = copy_character(c, encode, j);
		}
		encode[j++] = &#039;)&#039;;
		encode[j++] = &#039; &#039;;
	}
	encode[j-1] = &#039;)&#039;;
	encode[j] = &#039;&#092;&#048;&#039;;
	return VALID_REGEXP;
}

static int copy_code(int code, char *s, int i)
{
	int j;

	for(j = 0; codes[code][j] != &#039;&#092;&#048;&#039;; j++)
		s[i++] = codes[code][j];

	return i;
}

static int copy_special_characters(int code, char *s, int i)
{
	int j;

	s[i++] = &#039; &#039;;
	s[i++] = &#039;#&#039;;
	s[i++] = &#039;\\&#039;;

	for(j = 0; special_characters[code][j] != &#039;&#092;&#048;&#039;; j++)
		s[i++] = special_characters[code][j];

	return i;
}

static int copy_character(int c, char *s, int i)
{
	s[i++] = &#039; &#039;;
	s[i++] = &#039;#&#039;;
	s[i++] = &#039;\\&#039;;
	s[i++] = c;

	return i;
}
[/sourcecode]]]></description>
		<content:encoded><![CDATA[<p>A scratchy and long implementation in C</p>
<pre class="brush: cpp;">
#include &lt;stdio.h&gt;
#include &lt;ctype.h&gt;

static int copy_code(int code, char *s, int i);
static int copy_character(int c, char *s, int i);
static int copy_special_characters(int code, char *s, int i);

static char codes[][4] = {&quot;bol&quot;, &quot;eol&quot;, &quot;any&quot;, &quot;lit&quot;, &quot;ccl&quot;, &quot;ncl&quot;,	&quot;clo&quot;};
enum{ BOL = 0, EOL, ANY, LIT, CCL, NCL, CLO};

static char special_characters[][8] = {&quot;space&quot;, &quot;newline&quot;, &quot;tab&quot;};
enum{SPACE, NEWLINE, TAB};

enum{VALID_REGEXP = 0, INVALID_REGEXP};

int encode_regular_expression(char *regexp, char *encode)
{
	/* i is the index of current character in regexp ang j is the current character being output */
	int i, j, escaped;
	char c;

	i = j = escaped = 0;
	encode[j++] = '(';
	/* parse through the regular expression */
	for(;;)
	{
		/* read the character in regexp in c */
		c = regexp[i++];

		if(c == '&#092;&#048;')
			break;

		if(c == '\\')								/* escape character */
		{
			escaped = 1;
			continue;
		}

		encode[j++] = '(';

		if(!escaped &amp;&amp; c == '^' &amp;&amp; i == 1)					/* begining of line character '^' is not escaped and located at the start of regexp */
			j = copy_code(BOL, encode, j);
		else if(!escaped &amp;&amp; c == '$' &amp;&amp; regexp[i] == '&#092;&#048;')		/* end of line character '$' is not escaped and located at the end of regexp */
			j = copy_code(EOL, encode, j);
		else if(!escaped &amp;&amp; c == '.')							/* any character */
		{
			if(regexp[i] == '*')
			{
				j = copy_code(CLO, encode, j);
				encode[j++] = ' ';
				i++;
			}

			j = copy_code(ANY, encode, j);
		}
		else if(!escaped &amp;&amp; c == '[')							/* begining of character class */
		{
			int k;

			/* check for closure and validity of character class */
			for(k = i; regexp[k] != '&#092;&#048;' &amp;&amp; regexp[k] != ']'; k++);

			/* if no ending bracket, return invalid regexp */
			if(regexp[k] == '&#092;&#048;')
				return INVALID_REGEXP;

			/* check for closure */
			if(regexp[k+1] == '*')
			{
				j = copy_code(CLO, encode, j);
				encode[j++] = ' ';
			}

			/* check for negated character */
			if(regexp[i] == '^')
			{
				j = copy_code(NCL, encode, j);
				i++;
			}
			else
				j = copy_code(CCL, encode, j);

			while(regexp[i] != '&#092;&#048;' &amp;&amp; regexp[i] != ']')
			{
				char start, end;

				if(regexp[i+1] != '-')
				{
					j = copy_character(regexp[i], encode, j);
					i++;
					continue;
				}

				if(!isalnum(regexp[i]) &amp;&amp; !isalnum(regexp[i+2]))
					return INVALID_REGEXP;

				if(isalpha(regexp[i])  &amp;&amp; !isalpha(regexp[i+2]))
					return INVALID_REGEXP;

				if(isdigit(regexp[i])  &amp;&amp; !isdigit(regexp[i+2]))
					return INVALID_REGEXP;

				if(regexp[i] &gt; regexp[i+2])
					return INVALID_REGEXP;

				/*now expand the given range */
				for(start = regexp[i], end = regexp[i+2]; start &lt;= end; start++)
					j = copy_character(start, encode, j);

				i = i + 3;
			}

			i++;
			if(regexp[i] == '*')
				i++;
		}
		else							/* literal character */
		{
			if(regexp[i] == '*')
			{
				j = copy_code(CLO, encode, j);
				encode[j++] = ' ';
				i++;
			}

			j = copy_code(LIT, encode, j);

			/* handle special characters */
			if(escaped &amp;&amp; c == 'n')
				j = copy_special_characters(NEWLINE, encode, j);
			else if(escaped &amp;&amp; c == 't')
				j = copy_special_characters(TAB, encode, j);
			else if(c == ' ')
				j = copy_special_characters(SPACE, encode, j);
			else
				j = copy_character(c, encode, j);
		}
		encode[j++] = ')';
		encode[j++] = ' ';
	}
	encode[j-1] = ')';
	encode[j] = '&#092;&#048;';
	return VALID_REGEXP;
}

static int copy_code(int code, char *s, int i)
{
	int j;

	for(j = 0; codes[code][j] != '&#092;&#048;'; j++)
		s[i++] = codes[code][j];

	return i;
}

static int copy_special_characters(int code, char *s, int i)
{
	int j;

	s[i++] = ' ';
	s[i++] = '#';
	s[i++] = '\\';

	for(j = 0; special_characters[code][j] != '&#092;&#048;'; j++)
		s[i++] = special_characters[code][j];

	return i;
}

static int copy_character(int c, char *s, int i)
{
	s[i++] = ' ';
	s[i++] = '#';
	s[i++] = '\\';
	s[i++] = c;

	return i;
}
</pre>
]]></content:encoded>
	</item>
	<item>
		<title>By: programmingpraxis</title>
		<link>http://programmingpraxis.com/2009/09/15/regular-expressions-part-1/#comment-656</link>
		<dc:creator><![CDATA[programmingpraxis]]></dc:creator>
		<pubDate>Sun, 04 Oct 2009 00:21:44 +0000</pubDate>
		<guid isPermaLink="false">http://programmingpraxis.com/?p=1319#comment-656</guid>
		<description><![CDATA[Brzozowski&#039;s regular-expression matcher based on derivatives was on my to-do list.  Now I&#039;ll have to take it off.]]></description>
		<content:encoded><![CDATA[<p>Brzozowski&#8217;s regular-expression matcher based on derivatives was on my to-do list.  Now I&#8217;ll have to take it off.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Matt Might</title>
		<link>http://programmingpraxis.com/2009/09/15/regular-expressions-part-1/#comment-655</link>
		<dc:creator><![CDATA[Matt Might]]></dc:creator>
		<pubDate>Sun, 04 Oct 2009 00:15:42 +0000</pubDate>
		<guid isPermaLink="false">http://programmingpraxis.com/?p=1319#comment-655</guid>
		<description><![CDATA[I showed my compilers class how to build lexers using the derivative of regular expressions:

 http://matt.might.net/articles/implementation-of-regular-expression-matching-in-scheme-with-derivatives/

The implementation for regular languages is remarkably compact.]]></description>
		<content:encoded><![CDATA[<p>I showed my compilers class how to build lexers using the derivative of regular expressions:</p>
<p> <a href="http://matt.might.net/articles/implementation-of-regular-expression-matching-in-scheme-with-derivatives/" rel="nofollow">http://matt.might.net/articles/implementation-of-regular-expression-matching-in-scheme-with-derivatives/</a></p>
<p>The implementation for regular languages is remarkably compact.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: programmingpraxis</title>
		<link>http://programmingpraxis.com/2009/09/15/regular-expressions-part-1/#comment-614</link>
		<dc:creator><![CDATA[programmingpraxis]]></dc:creator>
		<pubDate>Wed, 16 Sep 2009 12:54:33 +0000</pubDate>
		<guid isPermaLink="false">http://programmingpraxis.com/?p=1319#comment-614</guid>
		<description><![CDATA[Jamie:  Thanks for pointing that out.  It&#039;s fixed now.]]></description>
		<content:encoded><![CDATA[<p>Jamie:  Thanks for pointing that out.  It&#8217;s fixed now.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jamie Hope</title>
		<link>http://programmingpraxis.com/2009/09/15/regular-expressions-part-1/#comment-613</link>
		<dc:creator><![CDATA[Jamie Hope]]></dc:creator>
		<pubDate>Wed, 16 Sep 2009 12:48:52 +0000</pubDate>
		<guid isPermaLink="false">http://programmingpraxis.com/?p=1319#comment-613</guid>
		<description><![CDATA[In your listing here, the &quot;&#035;&#092;&#092;&quot;s (corresponding to lines 55 and 58 of the codepad version) have been mangled into &quot;&#035;&#092;&quot;.]]></description>
		<content:encoded><![CDATA[<p>In your listing here, the &#8220;&#35;&#92;&#92;&#8221;s (corresponding to lines 55 and 58 of the codepad version) have been mangled into &#8220;&#35;&#92;&#8221;.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Remco Niemeijer</title>
		<link>http://programmingpraxis.com/2009/09/15/regular-expressions-part-1/#comment-611</link>
		<dc:creator><![CDATA[Remco Niemeijer]]></dc:creator>
		<pubDate>Wed, 16 Sep 2009 00:08:14 +0000</pubDate>
		<guid isPermaLink="false">http://programmingpraxis.com/?p=1319#comment-611</guid>
		<description><![CDATA[Updated code because I overlooked the bit of text between the two bulleted lists:

[sourcecode lang=&#039;css&#039;]
import Control.Applicative ((&lt;$&gt;), (*&gt;), (&lt;*), (&lt;*&gt;))
import Data.Char
import Text.Parsec
import Text.Parsec.String

data Elem = Lit Char &#124; Esc Char &#124; Any &#124; Set Bool [Elem] deriving Show
data Chunk = Elem Elem &#124; BoL &#124; EoL &#124; Star Elem deriving Show

regex :: Parser [Chunk]
regex = (++) &lt;$&gt; bol &lt;*&gt; many chunk where
    bol = option [] (const [BoL] &lt;$&gt; char &#039;^&#039;)
    chunk = choice [Star &lt;$&gt; try (element &lt;* char &#039;*&#039;),
                    const EoL &lt;$&gt; try (char &#039;$&#039; &lt;* eof),
                    Elem &lt;$&gt; element]
    element = choice [esc &lt;$&gt; try (char &#039;\\&#039; *&gt; anyChar),
                      const Any &lt;$&gt; char &#039;.&#039;,
                      Set False . expandSet &lt;$&gt; set &quot;[^&quot;,
                      Set True . expandSet &lt;$&gt; set &quot;[&quot;,
                      Lit &lt;$&gt; noneOf &quot;]&quot;]
    esc c = if elem c &quot;nt&quot; then Esc c else Lit c
    set s = try (string s *&gt; many1 element &lt;* char &#039;]&#039;)
    expandSet (Lit a:Lit &#039;-&#039;:Lit b:xs)
        &#124; validRange a b = map Lit [a..b] ++ expandSet xs
    expandSet (x:xs) = x : expandSet xs
    expandSet _ = []
    validRange a b = b &gt; a &amp;&amp; ((isLower a &amp;&amp; isLower b) &#124;&#124;
                               (isUpper a &amp;&amp; isUpper b) &#124;&#124;
                               (isDigit a &amp;&amp; isDigit b))
    
parseRegex :: String -&gt; Either ParseError [Chunk]
parseRegex = parse regex &quot;&quot;
[/sourcecode]]]></description>
		<content:encoded><![CDATA[<p>Updated code because I overlooked the bit of text between the two bulleted lists:</p>
<pre class="brush: css;">
import Control.Applicative ((&lt;$&gt;), (*&gt;), (&lt;*), (&lt;*&gt;))
import Data.Char
import Text.Parsec
import Text.Parsec.String

data Elem = Lit Char | Esc Char | Any | Set Bool [Elem] deriving Show
data Chunk = Elem Elem | BoL | EoL | Star Elem deriving Show

regex :: Parser [Chunk]
regex = (++) &lt;$&gt; bol &lt;*&gt; many chunk where
    bol = option [] (const [BoL] &lt;$&gt; char '^')
    chunk = choice [Star &lt;$&gt; try (element &lt;* char '*'),
                    const EoL &lt;$&gt; try (char '$' &lt;* eof),
                    Elem &lt;$&gt; element]
    element = choice [esc &lt;$&gt; try (char '\\' *&gt; anyChar),
                      const Any &lt;$&gt; char '.',
                      Set False . expandSet &lt;$&gt; set &quot;[^&quot;,
                      Set True . expandSet &lt;$&gt; set &quot;[&quot;,
                      Lit &lt;$&gt; noneOf &quot;]&quot;]
    esc c = if elem c &quot;nt&quot; then Esc c else Lit c
    set s = try (string s *&gt; many1 element &lt;* char ']')
    expandSet (Lit a:Lit '-':Lit b:xs)
        | validRange a b = map Lit [a..b] ++ expandSet xs
    expandSet (x:xs) = x : expandSet xs
    expandSet _ = []
    validRange a b = b &gt; a &amp;&amp; ((isLower a &amp;&amp; isLower b) ||
                               (isUpper a &amp;&amp; isUpper b) ||
                               (isDigit a &amp;&amp; isDigit b))
    
parseRegex :: String -&gt; Either ParseError [Chunk]
parseRegex = parse regex &quot;&quot;
</pre>
]]></content:encoded>
	</item>
	<item>
		<title>By: Remco Niemeijer</title>
		<link>http://programmingpraxis.com/2009/09/15/regular-expressions-part-1/#comment-610</link>
		<dc:creator><![CDATA[Remco Niemeijer]]></dc:creator>
		<pubDate>Tue, 15 Sep 2009 15:13:44 +0000</pubDate>
		<guid isPermaLink="false">http://programmingpraxis.com/?p=1319#comment-610</guid>
		<description><![CDATA[My Haskell solution (see http://bonsaicode.wordpress.com/2009/09/15/programming-praxis-regular-expressions-part-1/ for a version with comments):

[sourcecode lang=&#039;css&#039;]
import Control.Applicative ((&lt;$&gt;), (*&gt;), (&lt;*), (&lt;*&gt;))
import Text.Parsec
import Text.Parsec.String

data Elem = Lit Char &#124; Any &#124; Set Bool [Char] deriving Show
data Chunk = Elem Elem &#124; BoL &#124; EoL &#124; Star Elem deriving Show

regex :: Parser [Chunk]
regex = (++) &lt;$&gt; bol &lt;*&gt; many chunk where
    bol = option [] (const [BoL] &lt;$&gt; char &#039;^&#039;)
    chunk = choice [Star &lt;$&gt; try (element &lt;* char &#039;*&#039;),
                    const EoL &lt;$&gt; try (char &#039;$&#039; &lt;* eof),
                    Elem &lt;$&gt; element]
    element = choice [const Any &lt;$&gt; char &#039;.&#039;,
                      Set False . expandSet &lt;$&gt; set &quot;[^&quot;,
                      Set True . expandSet &lt;$&gt; set &quot;[&quot;,
                      Lit &lt;$&gt; anyChar]
    set s = try (string s *&gt; many1 (noneOf &quot;]&quot;) &lt;* char &#039;]&#039;)
    expandSet (a:&#039;-&#039;:b:xs) = [a..b] ++ expandSet xs
    expandSet (x:xs) = x : expandSet xs
    expandSet _ = []

parseRegex :: String -&gt; Either ParseError [Chunk]
parseRegex = parse regex &quot;&quot;
[/sourcecode]]]></description>
		<content:encoded><![CDATA[<p>My Haskell solution (see <a href="http://bonsaicode.wordpress.com/2009/09/15/programming-praxis-regular-expressions-part-1/" rel="nofollow">http://bonsaicode.wordpress.com/2009/09/15/programming-praxis-regular-expressions-part-1/</a> for a version with comments):</p>
<pre class="brush: css;">
import Control.Applicative ((&lt;$&gt;), (*&gt;), (&lt;*), (&lt;*&gt;))
import Text.Parsec
import Text.Parsec.String

data Elem = Lit Char | Any | Set Bool [Char] deriving Show
data Chunk = Elem Elem | BoL | EoL | Star Elem deriving Show

regex :: Parser [Chunk]
regex = (++) &lt;$&gt; bol &lt;*&gt; many chunk where
    bol = option [] (const [BoL] &lt;$&gt; char '^')
    chunk = choice [Star &lt;$&gt; try (element &lt;* char '*'),
                    const EoL &lt;$&gt; try (char '$' &lt;* eof),
                    Elem &lt;$&gt; element]
    element = choice [const Any &lt;$&gt; char '.',
                      Set False . expandSet &lt;$&gt; set &quot;[^&quot;,
                      Set True . expandSet &lt;$&gt; set &quot;[&quot;,
                      Lit &lt;$&gt; anyChar]
    set s = try (string s *&gt; many1 (noneOf &quot;]&quot;) &lt;* char ']')
    expandSet (a:'-':b:xs) = [a..b] ++ expandSet xs
    expandSet (x:xs) = x : expandSet xs
    expandSet _ = []

parseRegex :: String -&gt; Either ParseError [Chunk]
parseRegex = parse regex &quot;&quot;
</pre>
]]></content:encoded>
	</item>
	<item>
		<title>By: Programming Praxis &#8211; Regular Expressions, Part 1 &#171; Bonsai Code</title>
		<link>http://programmingpraxis.com/2009/09/15/regular-expressions-part-1/#comment-609</link>
		<dc:creator><![CDATA[Programming Praxis &#8211; Regular Expressions, Part 1 &#171; Bonsai Code]]></dc:creator>
		<pubDate>Tue, 15 Sep 2009 15:13:19 +0000</pubDate>
		<guid isPermaLink="false">http://programmingpraxis.com/?p=1319#comment-609</guid>
		<description><![CDATA[[...] Praxis &#8211; Regular Expressions, Part&#160;1 By Remco Niemeijer  In today&#8217;s Programming Praxis problem our task is to write a parser for simple regular expressions. Since [...]]]></description>
		<content:encoded><![CDATA[<p>[...] Praxis &#8211; Regular Expressions, Part&nbsp;1 By Remco Niemeijer  In today&#8217;s Programming Praxis problem our task is to write a parser for simple regular expressions. Since [...]</p>
]]></content:encoded>
	</item>
</channel>
</rss>

