<?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>简单生活 -- Kevin Yang的博客 &#187; 字符串匹配</title>
	<atom:link href="http://www.imkevinyang.com/tags/%e5%ad%97%e7%ac%a6%e4%b8%b2%e5%8c%b9%e9%85%8d/feed" rel="self" type="application/rss+xml" />
	<link>http://www.imkevinyang.com</link>
	<description>It&#039;s all about sharing</description>
	<lastBuildDate>Sun, 05 Feb 2012 15:37:14 +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>Visual Assist代码提示使用的字符串模糊匹配算法</title>
		<link>http://www.imkevinyang.com/2009/09/visual-assist%e4%bb%a3%e7%a0%81%e6%8f%90%e7%a4%ba%e4%bd%bf%e7%94%a8%e7%9a%84%e5%ad%97%e7%ac%a6%e4%b8%b2%e6%a8%a1%e7%b3%8a%e5%8c%b9%e9%85%8d%e7%ae%97%e6%b3%95.html</link>
		<comments>http://www.imkevinyang.com/2009/09/visual-assist%e4%bb%a3%e7%a0%81%e6%8f%90%e7%a4%ba%e4%bd%bf%e7%94%a8%e7%9a%84%e5%ad%97%e7%ac%a6%e4%b8%b2%e6%a8%a1%e7%b3%8a%e5%8c%b9%e9%85%8d%e7%ae%97%e6%b3%95.html#comments</comments>
		<pubDate>Mon, 28 Sep 2009 04:44:00 +0000</pubDate>
		<dc:creator>Kevin Yang</dc:creator>
				<category><![CDATA[代码库]]></category>
		<category><![CDATA[技术随笔]]></category>
		<category><![CDATA[Visual Assist]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[代码提示]]></category>
		<category><![CDATA[字符串匹配]]></category>
		<category><![CDATA[智能感知]]></category>
		<category><![CDATA[智能提示]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.imkevinyang.com/2009/09/visual-assist%e4%bb%a3%e7%a0%81%e6%8f%90%e7%a4%ba%e4%bd%bf%e7%94%a8%e7%9a%84%e5%ad%97%e7%ac%a6%e4%b8%b2%e6%a8%a1%e7%b3%8a%e5%8c%b9%e9%85%8d%e7%ae%97%e6%b3%95.html</guid>
		<description><![CDATA[<p>Visual Assist是Visual Studio上一个很强大的插件。特别是在代码提示方面，相比Visual Studio自带的要强很多。</p>
<p>Visual Studio自带的代码提示（智能感知）功能会根据我们敲入的字符串，找到相似的类或者方法等。但是它的匹配规则非常简单，就是前向匹配。例如当我们输入了Str&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>Visual Assist是Visual Studio上一个很强大的插件。特别是在代码提示方面，相比Visual Studio自带的要强很多。</p>
<p>Visual Studio自带的代码提示（智能感知）功能会根据我们敲入的字符串，找到相似的类或者方法等。但是它的匹配规则非常简单，就是前向匹配。例如当我们输入了String字符串，那么Visual Studio会列出String,StringBuilder,StringComparer等以“String”打头的字符串。这样的设计其实是非常不够用的。稍微敲快一些漏掉一两个字母是很正常的事情，但是在VS中就无法享受代码提示带来的便捷了。好在Visual Assist改进了这一点。</p>
<p>VA采用字符串模糊匹配的算法，即使你漏过了其中几个字母，或者当你想要搜索含有某个字符串的类、方法等的时候，VA都可以很好的列出你想找的东西。</p>
<p>例如，我想使用SqlConnectionStringBuilder这个类，但是这个类名太长了。那么我们只需要输入“sqlconbui”字符串即可。又或者，我们想看看类库中有什么和String相关的，我们只需要输入String即可。</p>
<p>一直很好奇它这个匹配算法是怎么实现的，在论坛问了别人都没什么人感兴趣。自己研究了一下，我觉得算法要求可以这样来描述：</p>
<blockquote><p>源字符串在经过若干次插入操作之后，能够变换成目标字符串。那么就说源字符串成功匹配到了目标字符串。否则不匹配。</p>
<p>插入操作，指的是在源字符串的任意位置上插入任意长度的字符串。 </p>
</blockquote>
<p>自己写了个大概的算法实现（C#版）：</p>
<pre class="csharpcode"><span class="rem">/// &lt;summary&gt;</span>
<span class="rem">/// 字符串模糊匹配。</span>
<span class="rem">/// &lt;/summary&gt;</span>
<span class="rem">/// &lt;param name=&quot;source&quot;&gt;&lt;/param&gt;</span>
<span class="rem">/// &lt;param name=&quot;search&quot;&gt;&lt;/param&gt;</span>
<span class="rem">/// &lt;returns&gt;&lt;/returns&gt;</span>
<span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">bool</span> FuzzySearch(String source, String search)
{
    <span class="kwrd">if</span> (String.IsNullOrEmpty(source))
    {
        <span class="kwrd">throw</span> <span class="kwrd">new</span> ArgumentNullException(<span class="str">&quot;source&quot;</span>);
    }
    <span class="kwrd">if</span> (String.IsNullOrEmpty(search))
    {
        <span class="kwrd">return</span> <span class="kwrd">true</span>;
    }
    <span class="rem">// 不区分大小写</span>
    source = source.ToLowerInvariant();
    search = search.ToLowerInvariant();
    <span class="kwrd">int</span> index = source.IndexOf(search[0]);
    <span class="kwrd">for</span> (<span class="kwrd">short</span> i = 1; i &lt; search.Length; i++)
    {
        <span class="kwrd">char</span> ch = search[i];
        index = source.IndexOf(ch, index + 1);
        <span class="kwrd">if</span> (index &lt; 0)
        {
            <span class="kwrd">return</span> <span class="kwrd">false</span>;
        }
    }
    <span class="kwrd">return</span> <span class="kwrd">true</span>;
}</pre>
<p>测试了一下，“sqlconbui”能够成功匹配到SqlConnectionStringBuilder。不过验证了其他几个字符串，发现和VA的算法还是有点差别的，感觉我这个匹配相比它的更宽松的样子。</p>
<p align="right">——<a href="http://www.imkevinyang.com/"><em><strong>Kevin Yang</strong></em></a></p>

	标签：<a href="http://www.imkevinyang.com/tags/visual-assist" title="Visual Assist" rel="tag">Visual Assist</a>, <a href="http://www.imkevinyang.com/tags/visual-studio" title="Visual Studio" rel="tag">Visual Studio</a>, <a href="http://www.imkevinyang.com/categories/techarticles/codebase" title="代码库" rel="tag">代码库</a>, <a href="http://www.imkevinyang.com/tags/%e4%bb%a3%e7%a0%81%e6%8f%90%e7%a4%ba" title="代码提示" rel="tag">代码提示</a>, <a href="http://www.imkevinyang.com/tags/%e5%ad%97%e7%ac%a6%e4%b8%b2%e5%8c%b9%e9%85%8d" title="字符串匹配" rel="tag">字符串匹配</a>, <a href="http://www.imkevinyang.com/categories/techarticles" title="技术随笔" rel="tag">技术随笔</a>, <a href="http://www.imkevinyang.com/tags/%e6%99%ba%e8%83%bd%e6%84%9f%e7%9f%a5" title="智能感知" rel="tag">智能感知</a>, <a href="http://www.imkevinyang.com/tags/%e6%99%ba%e8%83%bd%e6%8f%90%e7%a4%ba" title="智能提示" rel="tag">智能提示</a>, <a href="http://www.imkevinyang.com/tags/%e7%ae%97%e6%b3%95" title="算法" rel="tag">算法</a><br />

	<h4 style="background-color:#3B3B3B;border-bottom:2px groove gray;color:#F2F2F2;margin-top:20px;padding:6px 6px 6px 15px;margin:20px 0px 0px 0px">你可能对下面的文章感兴趣</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.imkevinyang.com/2010/09/visual-studio-2010%e9%87%8d%e5%91%bd%e5%90%8d%e9%87%8d%e6%9e%84%e6%97%b6%e5%87%ba%e7%8e%b0%e7%9a%84%e9%97%ae%e9%a2%98.html" title="Visual Studio 2010重命名重构时出现的问题 (2010/09/29)">Visual Studio 2010重命名重构时出现的问题</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/09/visual-studio%e5%b0%8f%e8%b4%b4%e5%a3%ab%e5%8a%a0%e4%ba%86try-catch%e4%b9%9f%e8%83%bd%e8%87%aa%e5%8a%a8%e5%ae%9a%e4%bd%8d%e5%88%b0%e5%bc%82%e5%b8%b8%e4%bb%a3%e7%a0%81.html" title="Visual Studio小贴士&mdash;&mdash;加了Try-Catch也能自动定位到异常代码 (2009/09/18)">Visual Studio小贴士&mdash;&mdash;加了Try-Catch也能自动定位到异常代码</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/05/visual-studio%e7%bb%9f%e8%ae%a1%e6%9c%89%e6%95%88%e4%bb%a3%e7%a0%81%e8%a1%8c%e6%95%b0.html" title="Visual Studio统计有效代码行数 (2009/05/22)">Visual Studio统计有效代码行数</a> </li>
	<li><a href="http://www.imkevinyang.com/2010/07/visual-studio%e7%bc%96%e8%be%91%e5%99%a8%e4%b8%80%e6%ac%a1%e7%bc%a9%e8%bf%9b%e5%8f%8d%e7%bc%a9%e8%bf%9b4%e4%b8%aa%e7%a9%ba%e6%a0%bc.html" title="Visual Studio编辑器一次缩进/反缩进4个空格 (2010/07/04)">Visual Studio编辑器一次缩进/反缩进4个空格</a> </li>
	<li><a href="http://www.imkevinyang.com/2010/05/vs2010%e7%9a%84ui%e8%ae%be%e8%ae%a1%e5%a4%b1%e8%af%af.html" title="VS2010的UI设计失误 (2010/05/31)">VS2010的UI设计失误</a> </li>
	<li><a href="http://www.imkevinyang.com/2011/04/vs%e7%bc%96%e8%af%91%e6%97%b6%e8%87%aa%e5%8a%a8%e5%bc%95%e7%94%a8debugrelease%e7%89%88%e6%9c%ac%e7%9a%84dll.html" title="VS编译时自动引用Debug|Release版本的dll (2011/04/10)">VS编译时自动引用Debug|Release版本的dll</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/08/%e4%bd%bf%e7%94%a8%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f%e6%89%be%e5%87%ba%e4%b8%8d%e5%8c%85%e5%90%ab%e7%89%b9%e5%ae%9a%e5%ad%97%e7%ac%a6%e4%b8%b2%e7%9a%84%e6%9d%a1%e7%9b%ae.html" title="使用正则表达式找出不包含特定字符串的条目 (2009/08/04)">使用正则表达式找出不包含特定字符串的条目</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/09/%e8%a7%a3%e5%86%b3silverlight%e6%97%a0%e6%b3%95%e8%b0%83%e8%af%95%e7%9a%84%e9%97%ae%e9%a2%98.html" title="解决Silverlight无法调试的问题 (2009/09/01)">解决Silverlight无法调试的问题</a> </li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.imkevinyang.com/2009/09/visual-assist%e4%bb%a3%e7%a0%81%e6%8f%90%e7%a4%ba%e4%bd%bf%e7%94%a8%e7%9a%84%e5%ad%97%e7%ac%a6%e4%b8%b2%e6%a8%a1%e7%b3%8a%e5%8c%b9%e9%85%8d%e7%ae%97%e6%b3%95.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>使用正则表达式找出不包含特定字符串的条目</title>
		<link>http://www.imkevinyang.com/2009/08/%e4%bd%bf%e7%94%a8%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f%e6%89%be%e5%87%ba%e4%b8%8d%e5%8c%85%e5%90%ab%e7%89%b9%e5%ae%9a%e5%ad%97%e7%ac%a6%e4%b8%b2%e7%9a%84%e6%9d%a1%e7%9b%ae.html</link>
		<comments>http://www.imkevinyang.com/2009/08/%e4%bd%bf%e7%94%a8%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f%e6%89%be%e5%87%ba%e4%b8%8d%e5%8c%85%e5%90%ab%e7%89%b9%e5%ae%9a%e5%ad%97%e7%ac%a6%e4%b8%b2%e7%9a%84%e6%9d%a1%e7%9b%ae.html#comments</comments>
		<pubDate>Mon, 03 Aug 2009 17:00:00 +0000</pubDate>
		<dc:creator>Kevin Yang</dc:creator>
				<category><![CDATA[技术随笔]]></category>
		<category><![CDATA[否定式前瞻]]></category>
		<category><![CDATA[字符串匹配]]></category>
		<category><![CDATA[排除特定字符串]]></category>
		<category><![CDATA[正则]]></category>
		<category><![CDATA[正则表达式]]></category>
		<category><![CDATA[肯定式前瞻]]></category>

		<guid isPermaLink="false">http://www.imkevinyang.com/2009/08/%e4%bd%bf%e7%94%a8%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f%e6%89%be%e5%87%ba%e4%b8%8d%e5%8c%85%e5%90%ab%e7%89%b9%e5%ae%9a%e5%ad%97%e7%ac%a6%e4%b8%b2%e7%9a%84%e6%9d%a1%e7%9b%ae.html</guid>
		<description><![CDATA[概述
<p>做日志分析工作的经常需要跟成千上万的日志条目打交道，为了在庞大的数据量中找到特定模式的数据，常常需要编写很多复杂的<a href="http://www.imkevinyang.com/2009/07/%e4%bd%bf%e7%94%a8%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f%e5%8c%b9%e9%85%8d%e5%b5%8c%e5%a5%97html%e6%a0%87%e7%ad%be.html" target="_blank">正则表达式</a>。例如枚举出日志文件中不包含某个特定字符串的条目，找出不以某个特定字符串打头的条目，等等。</p>
使用否定式前瞻
<p>正则表达式中有前瞻（Lookahead）和后顾（Lookbehind&#8230;</p>]]></description>
			<content:encoded><![CDATA[<h2>概述</h2>
<p>做日志分析工作的经常需要跟成千上万的日志条目打交道，为了在庞大的数据量中找到特定模式的数据，常常需要编写很多复杂的<a href="http://www.imkevinyang.com/2009/07/%e4%bd%bf%e7%94%a8%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f%e5%8c%b9%e9%85%8d%e5%b5%8c%e5%a5%97html%e6%a0%87%e7%ad%be.html" target="_blank">正则表达式</a>。例如枚举出日志文件中不包含某个特定字符串的条目，找出不以某个特定字符串打头的条目，等等。</p>
<h2>使用否定式前瞻</h2>
<p>正则表达式中有前瞻（Lookahead）和后顾（Lookbehind）的概念，这两个术语非常形象的描述了正则引擎的匹配行为。需要注意一点，正则表达式中的前和后和我们一般理解的前后有点不同。一段文本，我们一般习惯把文本开头的方向称作“前面”，文本末尾方向称为“后面”。但是<strong><span style="color: #008000;">对于正则表达式引擎来说，因为它是从文本头部向尾部开始解析的（可以通过正则选项控制解析方向），因此对于文本尾部方向，称为“前”，因为这个时候，正则引擎还没走到那块，而对文本头部方向，则称为“后”，因为正则引擎已经走过了那一块地方</span></strong>。如下图所示：</p>
<p><img style="margin: 0px; display: inline; border: 0px;" title="正向前瞻逆向前瞻" src="http://www.imkevinyang.com/wp-content/uploads/2009/08/image_thumb.png" border="0" alt="正向前瞻逆向前瞻" width="240" height="161" /></p>
<p>所谓的前瞻就是在正则表达式匹配到某个字符的时候，往“尚未解析过的文本”预先看一下，看是不是符合/不符合匹配模式，而后顾，就是在正则引擎已经匹配过的文本看看是不是符合/不符合匹配模式。符合和不符合特定匹配模式我们又称为<strong><span style="color: #008000;">肯定式匹配和否定式匹配</span></strong>。</p>
<p>现代高级正则表达式引擎一般都支持都支持前瞻，对于后顾支持并不是很广泛，因此我们这里采用否定式前瞻来实现我们的需求。</p>
<h2>实现</h2>
<p>测试数据：</p>
<pre class="csharpcode">2009-07-07 04:38:44 127.0.0.1 GET /robots.txt
2009-07-07 04:38:44 127.0.0.1 GET /posts/robotfile.txt
2009-07-08 04:38:44 127.0.0.1 GET /</pre>
<p>例如上面这几条简单的日志条目，我们想实现两个目标：</p>
<p>1. 把8号的数据过滤掉</p>
<p>2. 把那些不包含robots.txt字符串的条目给找出来（只要Url中包含robots.txt的都给过滤掉）。</p>
<p>前瞻的语法是：</p>
<pre class="csharpcode">(?!匹配模式)</pre>
<p>我们先来实现第一个目标——<strong><span style="color: #008000;">匹配不以特定字符串开头的条目</span></strong>。</p>
<p>这里我们因为要排除一段连续的字符串，因此匹配模式非常简单，就是2009-07-08。实现如下：</p>
<pre class="csharpcode">^(?!2009-07-08).*?$</pre>
<p>用<a title="Expresso正则表达式工具" href="http://www.imkevinyang.com/2009/07/%e3%80%90%e6%8e%a8%e8%8d%90%e3%80%91%e4%bd%bf%e7%94%a8ultrapico-expresso%e5%ad%a6%e4%b9%a0%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f.html" target="_blank">Expresso</a>我们可以看到结果确实过滤掉8号的数据。</p>
<p>接下来，我们来实现第二个目标——<strong><span style="color: #008000;">排除包含特定字符串的条目</span></strong>。</p>
<p>按照我们上面写法，我照葫芦画瓢了一下：</p>
<pre class="csharpcode">^.*?(?!robots\.txt).*?$</pre>
<p>这段正则用大白话描述就是：开头任意字符，然后后面不要跟着robots.txt连续字符串，然后再跟着任意个字符，字符串结尾。</p>
<p>运行测试，结果发现：</p>
<p><img style="margin: 0px; display: inline; border: 0px;" title="image" src="http://www.imkevinyang.com/wp-content/uploads/2009/08/image_thumb1.png" border="0" alt="image" width="360" height="83" /></p>
<p>没有达到我们想要的效果。这是为什么呢？我们给上面的正则表达式加上两个捕获分组调试一下：</p>
<pre class="csharpcode">^(.*?)(?!robots\.txt)(.*?)$</pre>
<p>测试结果：</p>
<p><img style="margin: 0px; display: inline; border: 0px;" title="image" src="http://www.imkevinyang.com/wp-content/uploads/2009/08/image_thumb2.png" border="0" alt="image" width="392" height="195" /></p>
<p>我们看到，第一个分组啥都没有匹配到，而第二个分组却匹配了整个字符串。再回过头来好好分析一下刚才那个正则表达式。实际上，当正则引擎解析到A区域的时候，就已经开始执行B区域的前瞻工作。这个时候发现当A区域为Null的时候匹配成功——.*本来就允许匹配空字符，前瞻条件又满足，A区域后面紧跟着的是“2009”字符串，而并不是robots。因此整个匹配过程成功匹配到所有条目。</p>
<p><img style="margin: 0px; display: inline; border: 0px;" title="image" src="http://www.imkevinyang.com/wp-content/uploads/2009/08/image_thumb3.png" border="0" alt="image" width="246" height="146" /></p>
<p>分析出原因之后我们对上述的正则进行修正，将.*?移入前瞻表达式，如下：</p>
<pre class="csharpcode">^(?!.*?robots).*$</pre>
<p>测试结果:</p>
<p><img style="margin: 0px; display: inline; border: 0px;" title="image" src="http://www.imkevinyang.com/wp-content/uploads/2009/08/image_thumb4.png" border="0" alt="image" width="360" height="72" /></p>
<p>Bingo!</p>
<p style="text-align: right;">——<a href="http://www.imkevinyang.com/"><em><strong>Kevin Yang</strong></em></a></p>

	标签：<a href="http://www.imkevinyang.com/tags/%e5%90%a6%e5%ae%9a%e5%bc%8f%e5%89%8d%e7%9e%bb" title="否定式前瞻" rel="tag">否定式前瞻</a>, <a href="http://www.imkevinyang.com/tags/%e5%ad%97%e7%ac%a6%e4%b8%b2%e5%8c%b9%e9%85%8d" title="字符串匹配" rel="tag">字符串匹配</a>, <a href="http://www.imkevinyang.com/categories/techarticles" title="技术随笔" rel="tag">技术随笔</a>, <a href="http://www.imkevinyang.com/tags/%e6%8e%92%e9%99%a4%e7%89%b9%e5%ae%9a%e5%ad%97%e7%ac%a6%e4%b8%b2" title="排除特定字符串" rel="tag">排除特定字符串</a>, <a href="http://www.imkevinyang.com/tags/%e6%ad%a3%e5%88%99" title="正则" rel="tag">正则</a>, <a href="http://www.imkevinyang.com/tags/%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f" title="正则表达式" rel="tag">正则表达式</a>, <a href="http://www.imkevinyang.com/tags/%e8%82%af%e5%ae%9a%e5%bc%8f%e5%89%8d%e7%9e%bb" title="肯定式前瞻" rel="tag">肯定式前瞻</a><br />

	<h4 style="background-color:#3B3B3B;border-bottom:2px groove gray;color:#F2F2F2;margin-top:20px;padding:6px 6px 6px 15px;margin:20px 0px 0px 0px">你可能对下面的文章感兴趣</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.imkevinyang.com/2010/07/javajs%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f%e5%8c%b9%e9%85%8d%e5%b5%8c%e5%a5%97html%e6%a0%87%e7%ad%be.html" title="Java/Js如何使用正则表达式匹配嵌套Html标签 (2010/07/30)">Java/Js如何使用正则表达式匹配嵌套Html标签</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/09/visual-assist%e4%bb%a3%e7%a0%81%e6%8f%90%e7%a4%ba%e4%bd%bf%e7%94%a8%e7%9a%84%e5%ad%97%e7%ac%a6%e4%b8%b2%e6%a8%a1%e7%b3%8a%e5%8c%b9%e9%85%8d%e7%ae%97%e6%b3%95.html" title="Visual Assist代码提示使用的字符串模糊匹配算法 (2009/09/28)">Visual Assist代码提示使用的字符串模糊匹配算法</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/07/%e4%bd%bf%e7%94%a8%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f%e5%8c%b9%e9%85%8d%e5%b5%8c%e5%a5%97html%e6%a0%87%e7%ad%be.html" title="使用正则表达式匹配嵌套Html标签 (2009/07/22)">使用正则表达式匹配嵌套Html标签</a> </li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.imkevinyang.com/2009/08/%e4%bd%bf%e7%94%a8%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f%e6%89%be%e5%87%ba%e4%b8%8d%e5%8c%85%e5%90%ab%e7%89%b9%e5%ae%9a%e5%ad%97%e7%ac%a6%e4%b8%b2%e7%9a%84%e6%9d%a1%e7%9b%ae.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using disk: enhanced

Served from: www.imkevinyang.com @ 2012-02-09 10:45:49 -->
