<?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>尘世中一条迷途小猪儿~~~</title>
	<atom:link href="http://blog.donews.com/guanvee/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.donews.com/guanvee</link>
	<description>[简单快乐每一天]</description>
	<lastBuildDate>Sun, 18 Jun 2006 07:54:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>别了，donews博客</title>
		<link>http://blog.donews.com/guanvee/archive/2006/06/18/920109.aspx</link>
		<comments>http://blog.donews.com/guanvee/archive/2006/06/18/920109.aspx#comments</comments>
		<pubDate>Sun, 18 Jun 2006 07:54:00 +0000</pubDate>
		<dc:creator>guanvee</dc:creator>
				<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://blog.donews.com/guanvee/archive/2006/06/18/920109.aspx</guid>
		<description><![CDATA[<p>最近感觉donews的博客太不稳定了，只好换个地方，换到了博客园</p><p></p><p><a href="http://guanvee.cnblogs.com">http://guanvee.cnblogs.com</a></p><p></p><p>欢迎大家来访。</p>]]></description>
			<content:encoded><![CDATA[<p>最近感觉donews的博客太不稳定了，只好换个地方，换到了博客园</p>
</p>
<p><a href="http://guanvee.cnblogs.com">http://guanvee.cnblogs.com</a></p>
</p>
<p>欢迎大家来访。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/guanvee/archive/2006/06/18/920109.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>正则表达式之道(转载)</title>
		<link>http://blog.donews.com/guanvee/archive/2006/06/15/917105.aspx</link>
		<comments>http://blog.donews.com/guanvee/archive/2006/06/15/917105.aspx#comments</comments>
		<pubDate>Thu, 15 Jun 2006 09:16:00 +0000</pubDate>
		<dc:creator>guanvee</dc:creator>
				<category><![CDATA[01--ASP.NET/ASP收藏]]></category>
		<category><![CDATA[13--其它收藏]]></category>

		<guid isPermaLink="false">http://blog.donews.com/guanvee/archive/2006/06/15/917105.aspx</guid>
		<description><![CDATA[<center><h1>正则表达式之道</h1></center><center><p>原著：Steve Mansour <br/>sman@scruznet.com <br/><font size="-1">Revised: June 5, 1999<br/>(copied by jm /at/ jmason.org from http://www.scruz.net/%7esman/regexp.htm, after the original disappeared! ) </font></p><p>翻译：Neo Lee<br/>neo.lee@gmail.com<br/><font size="-1">2004年10月16日</font></p></center><hr/><p><a href="http://sitescooper.org/tao_regexps.html">英文版原文</a></p><p>译者按：原文因为年代久远，文中很多链接早已过期（主要是关于vi、sed等工具的介绍和手册），本译文中已将此类链接删除，如需检查这些链接可以查看上面链接的原文。除此之外基本照原]]></description>
			<content:encoded><![CDATA[<p><center><br />
<h1>正则表达式之道</h1>
<p></center><center>
<p>原著：Steve Mansour <br/>sman@scruznet.com <br/><font size="-1">Revised: June 5, 1999<br/>(copied by jm /at/ jmason.org from http://www.scruz.net/%7esman/regexp.htm, after the original disappeared! ) </font></p>
<p>翻译：Neo Lee<br/>neo.lee@gmail.com<br/><font size="-1">2004年10月16日</font></p>
<p></center><br />
<hr/>
<p><a href="http://sitescooper.org/tao_regexps.html">英文版原文</a></p>
<p>译者按：原文因为年代久远，文中很多链接早已过期（主要是关于vi、sed等工具的介绍和手册），本译文中已将此类链接删除，如需检查这些链接可以查看上面链接的原文。除此之外基本照原文直译，括号中有&ldquo;译者按&rdquo;的部分是译者补充的说明。如有内容方面的问题请直接和Steve Mansor联系，当然，如果你只写中文，也可以和我联系。</p>
<hr/>
<h1>目 录</h1>
<p><b><a href="http://net.pku.edu.cn/~yhf/tao_regexps_zh.html#WhatAreRegularExpressions">什么是正则表达式</a></b> <br/><b><a href="http://net.pku.edu.cn/~yhf/tao_regexps_zh.html#SimpleCommands">范例</a></b> <br/>&nbsp;&nbsp; <a href="http://net.pku.edu.cn/~yhf/tao_regexps_zh.html#SimpleCommands">简单</a> <br/>&nbsp;&nbsp; <a href="http://net.pku.edu.cn/~yhf/tao_regexps_zh.html#MediumDifficultyExamples">中级（神奇的咒语）</a> <br/>&nbsp;&nbsp; <a href="http://net.pku.edu.cn/~yhf/tao_regexps_zh.html#HardExamples">困难（不可思议的象形文字）</a><br/><b><a href="http://net.pku.edu.cn/~yhf/tao_regexps_zh.html#Regular_Expressions_In_Various_Tools">不同工具中的正则表达式</a></b> </p>
</p>
<hr width="100%"/>
<h1><a name="WhatAreRegularExpressions"></a>什么是正则表达式</h1>
<p>一个正则表达式，就是用某种模式去匹配一类字符串的一个公式。很多人因为它们看上去比较古怪而且复杂所以不敢去使用&mdash;&mdash;很不幸，这篇文章也不能够改变这一点，不过，经过一点点练习之后我就开始觉得这些复杂的表达式其实写起来还是相当简单的，而且，一旦你弄懂它们，你就能把数小时辛苦而且易错的文本处理工作压缩在几分钟（甚至几秒钟）内完成。正则表达式被各种文本编辑软件、类库（例如Rogue Wave的tools.h++）、脚本工具（像awk/grep/sed）广泛的支持，而且像Microsoft的Visual C++这种交互式IDE也开始支持它了。
<p>我们将在如下的章节中利用一些例子来解释正则表达式的用法，绝大部分的例子是基于<b><tt>vi</tt></b>中的文本替换命令和<b><tt>grep</tt></b>文件搜索命令来书写的，不过它们都是比较典型的例子，其中的概念可以在sed、awk、perl和其他支持正则表达式的编程语言中使用。你可以看看<a href="http://net.pku.edu.cn/~yhf/tao_regexps_zh.html#Regular_Expressions_In_Various_Tools">不同工具中的正则表达式</a>这一节，其中有一些在别的工具中使用正则表达式的例子。还有一个关于vi中文本替换命令（s）的<a href="http://net.pku.edu.cn/~yhf/tao_regexps_zh.html#ViSubstitutionCommandSyntax">简单说明</a>附在文后供参考。</p>
<h2>正则表达式基础</h2>
<p>正则表达式由一些普通字符和一些<i>元字符（metacharacters）</i>组成。普通字符包括大小写的字母和数字，而元字符则具有特殊的含义，我们下面会给予解释。
<p>在最简单的情况下，一个正则表达式看上去就是一个普通的查找串。例如，正则表达式&quot;testing&quot;中没有包含任何元字符，，它可以匹配&quot;testing&quot;和&quot;123testing&quot;等字符串，但是不能匹配&quot;Testing&quot;。</p>
<p>要想真正的用好正则表达式，正确的理解元字符是最重要的事情。下表列出了所有的元字符和对它们的一个简短的描述。 </p>
<p>
<table cellspacing="2" cellpadding="2">
<tbody>
<tr valign="baseline">
<th align="left"><b><i>元字符</i></b></th>
<td>&nbsp;</td>
<th align="left"><b><i>描述</i></b></th>
</tr>
<tr>
<td>
<hr width="100%"/></td>
<td></td>
<td>
<hr width="100%"/></td>
</tr>
<tr>
<td valign="top" align="center"><center><b><tt><font face="Courier New"><font size="+1">.</font></font></tt></b> </center></td>
<td></td>
<td>匹配任何单个字符。例如正则表达式<b><tt>r.t</tt></b>匹配这些字符串：<i>rat</i>、<i>rut</i>、<i>r t</i>，但是不匹配<i>root</i>。&nbsp;</td>
</tr>
<tr>
<td valign="top"><center><b><tt><font face="Courier New"><font size="+1">$</font></font></tt></b> </center></td>
<td></td>
<td>匹配行结束符。例如正则表达式<b><tt>weasel$</tt></b> 能够匹配字符串&quot;<i>He&#8217;s a weasel</i>&quot;的末尾，但是不能匹配字符串&quot;<i>They are a bunch of weasels.</i>&quot;。&nbsp;</td>
</tr>
<tr>
<td valign="top"><center><b><font size="+1">^</font></b> </center></td>
<td></td>
<td>匹配一行的开始。例如正则表达式<b><tt>^When in</tt></b>能够匹配字符串&quot;<i>When in the course of human events</i>&quot;的开始，但是不能匹配&quot;<i>What and When in the&quot;。</i></td>
</tr>
<tr>
<td valign="top"><center><b><tt><font face="Courier New"><font size="+1">*</font></font></tt></b> </center></td>
<td></td>
<td>匹配0或多个正好在它之前的那个字符。例如正则表达式<b><tt></tt></b><b><tt>.*</tt></b>意味着能够匹配任意数量的任何字符。</td>
</tr>
<tr>
<td valign="top"><center><b><tt><font face="Courier New"><font size="+1">\</font></font></tt></b> </center></td>
<td></td>
<td>这是引用府，用来将这里列出的这些元字符当作普通的字符来进行匹配。例如正则表达式<b><tt>\$</tt></b>被用来匹配美元符号，而不是行尾，类似的，正则表达式<tt><strong>\.</strong></tt>用来匹配点字符，而不是任何字符的通配符。</td>
</tr>
<tr>
<td valign="top"><center><b><tt><font face="Courier New"><font size="+1">[ ]&nbsp;</font></font></tt></b> <br/><b><tt><font face="Courier New"><font size="+1">[c</font><font size="-1">1</font><font size="+1">-c</font><font size="-1">2</font><font size="+1">]</font></font></tt></b> <br/><b><tt><font face="Courier New"><font size="+1">[^c</font><font size="-1">1</font><font size="+1">-c</font><font size="-1">2</font><font size="+1">]</font></font></tt></b> </center></td>
<td></td>
<td>匹配括号中的任何一个字符。例如正则表达式<b><tt>r[aou]t</tt></b>匹配<i>rat</i>、<i>rot</i>和<i>rut</i>，但是不匹配<i>ret</i>。可以在括号中使用连字符-来指定字符的区间，例如正则表达式<b><tt>[0-9]</tt></b>可以匹配任何数字字符；还可以制定多个区间，例如正则表达式<b><tt>[A-Za-z]</tt></b>可以匹配任何大小写字母。另一个重要的用法是&ldquo;排除&rdquo;，要想匹配<i>除了</i>指定区间之外的字符&mdash;&mdash;也就是所谓的补集&mdash;&mdash;在左边的括号和第一个字符之间使用^字符，例如正则表达式<b><tt>[^269A-Z]</tt></b> 将匹配除了2、6、9和所有大写字母之外的任何字符。</td>
</tr>
<tr>
<td valign="top"><center><b><tt><font face="Courier New"><font size="+1">\&lt; \&gt;</font></font></tt></b> </center></td>
<td></td>
<td>匹配词（<em>word</em>）的开始（\&lt;）和结束（\&gt;）。例如正则表达式<b><tt><font face="Courier New">\&lt;the</font></tt></b>能够匹配字符串&quot;<i>for the wise</i>&quot;中的&quot;the&quot;，但是不能匹配字符串&quot;<i>otherwise</i>&quot;中的&quot;the&quot;。<strong>注意</strong>：这个元字符不是所有的软件都支持的。</td>
</tr>
<tr>
<td valign="top"><center><b><tt><font face="Courier New"><font size="+1">\( \)</font></font></tt></b> </center></td>
<td></td>
<td>将 \( 和 \) 之间的表达式定义为&ldquo;组&rdquo;（<em>group</em>），并且将匹配这个表达式的字符保存到一个临时区域（一个正则表达式中最多可以保存9个），它们可以用 <b><tt>\1</tt></b> 到<b><tt>\9</tt></b> 的符号来引用。</td>
</tr>
<tr>
<td valign="baseline"><center><b><tt><font face="Courier New"><font size="+1">|</font></font></tt></b> </center></td>
<td></td>
<td>将两个匹配条件进行逻辑&ldquo;或&rdquo;（<em>Or</em>）运算。例如正则表达式<b><tt><font face="Courier New">(him|her)</font></tt></b> 匹配&quot;<i>it belongs to him</i>&quot;和&quot;<i>it belongs to her</i>&quot;，但是不能匹配&quot;<i>it belongs to them.</i>&quot;。<strong>注意</strong>：这个元字符不是所有的软件都支持的。</td>
</tr>
<tr valign="baseline">
<td><center><b><tt><font face="Courier New"><font size="+1">+</font></font></tt></b> </center></td>
<td></td>
<td>匹配1或多个正好在它之前的那个字符。例如正则表达式<b><tt></tt></b><b><tt></tt></b><b><tt>9+</tt></b>匹配9、99、999等。<strong>注意</strong>：这个元字符不是所有的软件都支持的。</td>
</tr>
<tr valign="baseline">
<td><center><b><tt><font size="+1">?</font></tt></b> </center></td>
<td></td>
<td>匹配0或1个正好在它之前的那个字符。<strong>注意</strong>：这个元字符不是所有的软件都支持的。</td>
</tr>
<tr valign="baseline">
<td><center><b><font size="+1"><tt><font face="Courier New">\{</font></tt><i>i</i><tt><font face="Courier New">\}</font></tt></font></b> <br/><b><font size="+1"><tt><font face="Courier New">\{</font></tt><i>i</i><tt><font face="Courier New">,</font></tt><i>j</i><tt><font face="Courier New">\}</font></tt></font></b> </center></td>
<td></td>
<td valign="baseline">匹配指定数目的字符，这些字符是在它之前的表达式定义的。例如正则表达式<b><tt><font face="Courier New">A[0-9]\{3\}</font></tt></b> 能够匹配字符&quot;A&quot;后面跟着正好3个数字字符的串，例如A123、A348等，但是不匹配A1234。而正则表达式<b><tt><font face="Courier New">[0-9]\{4,6\}</font></tt></b> 匹配连续的任意4个、5个或者6个数字字符。<strong>注意</strong>：这个元字符不是所有的软件都支持的。</td>
</tr>
</tbody>
</table>
</p>
<hr width="100%"/>
<p>最简单的元字符是点，它能够匹配任何单个字符（注意<strong>不</strong>包括新行符）。假定有个文件test.txt包含以下几行内容：</p>
<ul><tt>he is a rat</tt><br/><tt>he is in a rut</tt><br/><tt>the food is Rotten</tt><br/><tt>I like root beer</tt> </ul>
<p>我们可以使用grep命令来测试我们的正则表达式，grep命令使用正则表达式去尝试匹配指定文件的每一行，并将至少有一处匹配表达式的所有行显示出来。命令
<ul><tt>grep r.t test.txt</tt> </ul>
<p>在test.txt文件中的每一行中搜索正则表达式<b><tt>r.t</tt></b>，并打印输出匹配的行。正则表达式<b><tt>r.t</tt></b>匹配一个<b><tt>r</tt></b>接着任何一个字符再接着一个<b><tt>t</tt></b>。所以它将匹配文件中的<b><tt>rat</tt></b>和<b><tt>rut</tt></b>，而不能匹配<b><tt>Rotten</tt></b>中的<b><tt>Rot</tt></b>，因为正则表达式是大小写敏感的。要想同时匹配大写和小写字母，应该使用字符区间元字符（方括号）。正则表达式<b><tt>[Rr]</tt></b>能够同时匹配<b><tt>R</tt></b>和<b><tt>r</tt></b>。所以，要想匹配一个大写或者小写的<b><tt>r</tt></b>接着任何一个字符再接着一个<b><tt>t</tt></b>就要使用这个表达式：<b><tt>[Rr].t</tt></b>。
<p>要想匹配行首的字符要使用抑扬字符（<em>^</em>）&mdash;&mdash;又是也被叫做插入符。例如，想找到text.txt中行首&quot;he&quot;打头的行，你可能会先用简单表达式<b><tt>he</tt></b>，但是这会匹配第三行的<b><tt>the</tt></b>，所以要使用正则表达式<b><tt>^he</tt></b>，它只匹配在行首出现的<b><tt>h</tt></b>。 </p>
<p>有时候指定&ldquo;除了&times;&times;&times;都匹配&rdquo;会比较容易达到目的，当抑扬字符（<em>^</em>）出现在方括号中是，它表示&ldquo;排除&rdquo;，例如要匹配<b><tt>he</tt></b> ，但是排除前面是<b><tt>t</tt></b> or <b><tt>s</tt></b>的情性（也就是<b><tt>the</tt></b>和<b><tt>s</tt></b><b><tt>he</tt></b>），可以使用：<b><tt>[^st]he</tt></b>。 </p>
<p>可以使用方括号来指定多个字符区间。例如正则表达式<b><tt>[A-Za-z]</tt></b>匹配任何字母，包括大写和小写的；正则表达式<b><tt>[A-Za-z][A-Za-z]*</tt></b> 匹配一个字母后面接着0或者多个字母（大写或者小写）。当然我们也可以用元字符<b><tt>+</tt></b>做到同样的事情，也就是：<b><tt>[A-Za-z]+</tt></b> ，和<b><tt>[A-Za-z][A-Za-z]*</tt></b>完全等价。但是要注意元字符<b><tt>+</tt></b> 并不是所有支持正则表达式的程序都支持的。关于这一点可以参考后面的<a href="http://net.pku.edu.cn/~yhf/tao_regexps_zh.html#Regular%20Expressions%20Syntax">正则表达式语法支持情况</a>。</p>
<p>要指定特定数量的匹配，要使用大括号（注意必须使用反斜杠来转义）。想匹配所有<b><tt>100</tt></b>和<b><tt>1000</tt></b>的实例而排除<b><tt>10</tt></b>和<b><tt>10000</tt></b>，可以使用：<b><tt>10\{2,3\}</tt></b>，这个正则表达式匹配数字1后面跟着2或者3个0的模式。在这个元字符的使用中一个有用的变化是忽略第二个数字，例如正则表达式<b><tt>0\{3,\}</tt></b> 将匹配至少3个连续的0。</p>
<h2><a name="SimpleCommands"></a>简单的例子</h2>
<p>这里有一些有代表性的、比较简单的例子。 </p>
<p>
<table cellspacing="2" cellpadding="2">
<tbody>
<tr>
<td><b><i>vi 命令</i></b></td>
<td><b><i>作用</i></b></td>
</tr>
<tr>
<td>
<hr width="100%"/></td>
<td>
<hr width="100%"/></td>
</tr>
<tr>
<td><b><tt><font face="Courier New"><font size="+1">:%s/ */ /g</font></font></tt></b></td>
<td>把一个或者多个空格替换为一个空格。</td>
</tr>
<tr>
<td><b><tt><font face="Courier New"><font size="+1">:%s/ *$//</font></font></tt></b></td>
<td>去掉行尾的所有空格。</td>
</tr>
<tr>
<td><b><tt><font face="Courier New"><font size="+1">:%s/^/ /</font></font></tt></b></td>
<td>在每一行头上加入一个空格。</td>
</tr>
<tr>
<td><b><tt><font face="Courier New"><font size="+1">:%s/^[0-9][0-9]* //</font></font></tt></b></td>
<td>去掉行首的所有数字字符。</td>
</tr>
<tr>
<td><b><tt><font face="Courier New"><font size="+1">:%s/b[aeio]g/bug/g</font></font></tt></b></td>
<td>将所有的<i>bag</i>、<i>beg</i>、<i>big</i>和<i>bog</i>改为<i>bug</i>。&nbsp;</td>
</tr>
<tr>
<td><b><tt><font face="Courier New"><font size="+1">:%s/t\([aou]\)g/h\1t/g</font></font></tt></b></td>
<td>将所有<i>tag</i>、<i>tog</i>和<i>tug</i>分别改为<i>hat</i>、<i>hot</i>和<i>hug</i>（注意用group的用法和使用\1引用前面被匹配的字符）。</td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<h2><a name="MediumDifficultyExamples"></a>中级的例子（神奇的咒语）</h2>
<h3>例1</h3>
<p>将所有方法foo(<i>a,b,c</i>)的实例改为foo(<i>b,a,c</i>)。这里a、b和c可以是任何提供给方法foo()的参数。也就是说我们要实现这样的转换： </p>
<p>
<table cellspacing="4" cellpadding="0">
<tbody>
<tr>
<td><b>之前</b></td>
<td>&nbsp;</td>
<td><b>之后</b></td>
</tr>
<tr>
<td><tt>foo(10,7,2)</tt></td>
<td></td>
<td><tt>foo(7,10,2)</tt></td>
</tr>
<tr>
<td><tt>foo(x+13,y-2,10)</tt></td>
<td></td>
<td><tt>foo(y-2,x+13,10)</tt></td>
</tr>
<tr>
<td><tt>foo( bar(8), x+y+z, 5)</tt></td>
<td></td>
<td><tt>foo( x+y+z, bar(8), 5)</tt></td>
</tr>
</tbody>
</table>
<p>下面这条替换命令能够实现这一魔法：</p>
<ul><b><tt><font face="Courier New">:%s/foo(\([^,]*\),\([^,]*\),\([^)]*\))/foo(\2,\1,\3)/g</font></tt></b> </ul>
<p>现在让我们把它打散来加以分析。写出这个表达式的基本思路是找出foo()和它的括号中的三个参数的位置。第一个参数是用这个表达式来识别的：：<b><tt><font face="Courier New">\([^,]*\)</font></tt></b>，我们可以从里向外来分析它：&nbsp; </p>
<p>
<table>
<tbody>
<tr>
<td><b><tt><font face="Courier New">[^,]</font></tt></b></td>
<td>&nbsp;</td>
<td>除了逗号之外的任何字符</td>
</tr>
<tr>
<td><b><tt><font face="Courier New">[^,]*</font></tt></b></td>
<td></td>
<td>0或者多个非逗号字符</td>
</tr>
<tr>
<td><b><tt><font face="Courier New">\([^,]*\)</font></tt></b></td>
<td></td>
<td>将这些非逗号字符标记为<b><tt>\1</tt></b>，这样可以在之后的替换模式表达式中引用它</td>
</tr>
<tr valign="baseline">
<td><b><tt><font face="Courier New">\([^,]*\),</font></tt></b></td>
<td></td>
<td>我们必须找到0或者多个非逗号字符后面跟着一个逗号，并且非逗号字符那部分要标记出来以备后用。</td>
</tr>
</tbody>
</table>
<p>现在正是指出一个使用正则表达式常见错误的最佳时机。为什么我们要使用<b><tt><font face="Courier New">[^,]*</font></tt></b>这样的一个表达式，而不是更加简单直接的写法，例如：<b><tt><font face="Courier New">.*</font></tt></b>，来匹配第一个参数呢？设想我们使用模式<b><tt><font face="Courier New">.*</font></tt></b>来匹配字符串&quot;10,7,2&quot;，它应该匹配&quot;10,&quot;还是&quot;10,7,&quot;？为了解决这个两义性（ambiguity），正则表达式规定一律按照最长的串来，在上面的例子中就是&quot;10,7,&quot;，显然这样就找出了两个参数而不是我们期望的一个。所以，我们要使用<b><tt><font face="Courier New">[^,]*</font></tt></b>来强制取出第一个逗号之前的部分。</p>
<p>这个表达式我们已经分析到了：<b><tt><font face="Courier New">foo(\([^,]*\)</font></tt></b>，这一段可以简单的翻译为&ldquo;当你找到<b><tt>foo(</tt></b>就把其后直到第一个逗号之前的部分标记为<b><tt><font face="Courier New">\1</font></tt></b>&rdquo;。然后我们使用同样的办法标记第二个参数为<b><tt><font face="Courier New">\2</font></tt></b>。对第三个参数的标记方法也是一样，只是我们要搜索所有的字符直到右括号。我们并没有必要去搜索第三个参数，因为我们不需要调整它的位置，但是这样的模式能够保证我们只去替换那些有三个参数的foo()方法调用，在foo()是一个重载（overoading）方法时这种明确的模式往往是比较保险的。然后，在替换部分，我们找到foo()的对应实例，然后利用标记好的部分进行替换，是的第一和第二个参数交换位置。</p>
<h3>例2</h3>
<p>假设有一个CSV（comma separated value）文件，里面有一些我们需要的信息，但是格式却有问题，目前数据的列顺序是：姓名，公司名，州名缩写，邮政编码，现在我们希望讲这些数据重新组织，以便在我们的某个软件中使用，需要的格式为：姓名，州名缩写-邮政编码，公司名。也就是说，我们要调整列顺序，还要合并两个列来构成一个新列。另外，我们的软件不能接受逗号前后面有任何空格（包括空格和制表符）所以我们还必须要去掉逗号前后的所有空格。
<p>这里有几行我们现在的数据：</p>
<ul><tt>Bill Jones,&nbsp;&nbsp;&nbsp;&nbsp; HI-TEK Corporation ,&nbsp; CA, 95011</tt> <br/><tt><font face="Courier New">Sharon Lee Smith,&nbsp; Design Works Incorporated,&nbsp; CA, 95012</font></tt> <br/><tt><font face="Courier New">B. Amos&nbsp;&nbsp; ,&nbsp; Hill Street Cafe,&nbsp; CA, 95013</font></tt> <br/><tt><font face="Courier New">Alexander Weatherworth,&nbsp; The Crafts Store,&nbsp; CA, 95014</font></tt> <br/><tt><font face="Courier New">...</font></tt> </ul>
<p>我们希望把它变成这个样子：
<ul><tt>Bill Jones,CA 95011,HI-TEK Corporation</tt> <br/><tt><font face="Courier New">Sharon Lee Smith,CA 95012,Design Works Incorporated</font></tt> <br/><tt><font face="Courier New">B. Amos,CA 95013,Hill Street Cafe</font></tt> <br/><tt><font face="Courier New">Alexander Weatherworth,CA 95014,The Crafts Store</font></tt> <br/><tt><font face="Courier New">...</font></tt> </ul>
<p>我们将用两个正则表达式来解决这个问题。第一个移动列和合并列，第二个用来去掉空格。
<p>下面就是第一个替换命令：</p>
<ul><b><tt><font face="Courier New">:%s/\([^,]*\),\([^,]*\),\([^,]*\),\(.*\)/\1,\3 \4,\2/</font></tt></b> </ul>
<p>这里的方法跟例1基本一样，第一个列（姓名）用这个表达式来匹配：<b><tt><font face="Courier New">\([^,]*\)</font></tt></b>，即第一个逗号之前的所有字符，而姓名内容被用<b><tt><font face="Courier New">\1</font></tt></b>标记下来。公司名和州名缩写字段用同样的方法标记为<b><tt><font face="Courier New">\2</font></tt></b>和<b><tt><font face="Courier New">\3</font></tt></b>，而最后一个字段用<b><tt><font face="Courier New">\(.*\)</font></tt></b>来匹配（&quot;匹配所有字符直到行末&quot;）。替换部分则引用上面标记的那些内容来进行构造。
<p>下面这个替换命令则用来去除空格：</p>
<ul><b><tt><font face="Courier New">:%s/[ \t]*,[ \t]*/,/g</font></tt></b> </ul>
<p>我们还是分解来看：<b><tt><font face="Courier New">[ \t]</font></tt></b>匹配空格/制表符，<b><tt><font face="Courier New">[ \t]*</font></tt></b> 匹配0或多个空格/制表符，<b><tt>[ \t]*</tt></b>,匹配0或多个空格/制表符后面再加一个逗号，最后，<b><tt><font face="Courier New">[ \t]*,[ \t]*</font></tt></b>匹配0或多个空格/制表符接着一个逗号再接着0或多个空格/制表符。在替换部分，我们简单的我们找到的所有东西替换成一个逗号。这里我们使用了结尾的可选的<b><tt>g</tt></b>参数，这表示在每行中对所有匹配的串执行替换（而不是缺省的只替换第一个匹配串）。<br />
<h3>例3</h3>
<p>假设有一个多字符的片断重复出现，例如：<br />
<blockquote><tt>Billy tried really hard</tt> <br/><tt>Sally tried really really hard</tt> <br/><tt>Timmy tried really really really hard</tt> <br/><tt>Johnny tried really really really really hard</tt></p></blockquote>
<p>而你想把&quot;really&quot;、&quot;really really&quot;，以及任意数量连续出现的&quot;really&quot;字符串换成一个简单的&quot;very&quot;（simple is good!），那么以下命令：<br />
<blockquote><b><tt>:%s/\(really \)\(really \)*/very /</tt></b></p></blockquote>
<p>就会把上述的文本变成：<br />
<blockquote><tt>Billy tried very hard</tt> <br/><tt>Sally tried very hard</tt> <br/><tt>Timmy tried very hard</tt> <br/><tt>Johnny tried very hard</tt></p></blockquote>
<p>表达式<b><tt>\(really \)*</tt></b>匹配0或多个连续的&quot;really &quot;（注意结尾有个空格），而<b><tt>\(really \)\(really \)*</tt></b> 匹配1个或多个连续的&quot;really &quot;实例。<br />
<h2><a name="HardExamples"></a>困难的例子（不可思议的象形文字）</h2>
<p><i>Coming soon</i>.
</p>
<hr/>
<h1><a name="Regular_Expressions_In_Various_Tools"></a>不同工具中的正则表达式</h1>
<p>OK，你已经准备使用RE（regular expressions，正则表达式），但是你并准备使用vi。所以，在这里我们给出一些在其他工具中使用RE的例子。另外，我还会总结一下你在不同程序之间使用RE可能发现的区别。
<p>当然，你也可以在Visual C++编辑器中使用RE。选择Edit-&gt;Replace，然后选择&quot;Regular expression&quot;选择框，Find What输入框对应上面介绍的vi命令<b><tt>:%s/pat1/pat2/g</tt></b>中的pat1部分，而Replace输入框对应pat2部分。但是，为了得到vi的执行范围和<b><tt>g</tt></b>选项，你要使用Replace All或者适当的手工Find Next and Replace（译者按：知道为啥有人骂微软弱智了吧，虽然VC中可以选中一个范围的文本，然后在其中执行替换，但是总之不够vi那么灵活和典雅）。</p>
<h2>sed</h2>
<p>Sed是<b><u>S</u></b>tream <b><u>ED</u></b>itor的缩写，是Unix下常用的基于文件和管道的编辑工具，可以在手册中得到关于sed的详细信息。 </p>
<p>这里是一些有趣的sed脚本，假定我们正在处理一个叫做price.txt的文件。注意这些编辑并不会改变源文件，sed只是处理源文件的每一行并把结果显示在标准输出中（当然很容易使用重定向来定制）： </p>
<p>
<table>
<tbody>
<tr>
<td><b><i>sed脚本</i></b></td>
<td>&nbsp;</td>
<td><b><i>描述</i></b></td>
</tr>
<tr>
<td>
<hr width="100%"/></td>
<td></td>
<td>
<hr width="100%"/></td>
</tr>
<tr valign="baseline">
<td><b><tt>sed 's/^$/d' price.txt</tt></b></td>
<td></td>
<td>删除所有空行</td>
</tr>
<tr>
<td><b><tt>sed 's/^[ \t]*$/d' price.txt</tt></b></td>
<td></td>
<td>删除所有只包含空格或者制表符的行</td>
</tr>
<tr>
<td><b><tt>sed 's/&quot;//g' price.txt</tt></b></td>
<td></td>
<td>删除所有引号</td>
</tr>
</tbody>
</table>
<h2>awk</h2>
<p>awk是一种编程语言，可以用来对文本数据进行复杂的分析和处理。可以在手册中得到关于awk的详细信息。这个古怪的名字是它作者们的姓的缩写（Aho，Weinberger和Kernighan）。
<p>在Aho，Weinberger和Kernighan的书<u>The AWK Programming Language</u>中有很多很好的awk的例子，请不要让下面这些微不足道的脚本例子限制你对awk强大能力的理解。我们同样假定我们针对price.txt文件进行处理，跟sed一样，awk也只是把结果显示在终端上。&nbsp; </p>
<p>
<table>
<tbody>
<tr>
<td><b><i>awk脚本</i></b></td>
<td>&nbsp;</td>
<td><b><i>描述</i></b></td>
</tr>
<tr>
<td>
<hr width="100%"/></td>
<td></td>
<td>
<hr width="100%"/></td>
</tr>
<tr valign="baseline">
<td><b><tt>awk '$0 !~ /^$/' price.txt</tt></b></td>
<td></td>
<td>删除所有空行</td>
</tr>
<tr>
<td><b><tt>awk 'NF &gt; 0' price.txt</tt></b></td>
<td></td>
<td>awk中一个更好的删除所有行的办法</td>
</tr>
<tr valign="baseline">
<td><b><tt>awk '$2 ~ /^[JT]/ {print $3}' price.txt</tt></b></td>
<td></td>
<td>打印所有第二个字段是&#8217;J'或者&#8217;T'打头的行中的第三个字段</td>
</tr>
<tr valign="baseline">
<td nowrap="65535"><b><tt>awk '$2 !~ /[Mm]isc/ {print $3 + $4}' price.txt</tt></b></td>
<td></td>
<td>针对所有第二个字段不包含&#8217;Misc&#8217;或者&#8217;misc&#8217;的行，打印第3和第4列的和（假定为数字）</td>
</tr>
<tr valign="baseline">
<td><b><tt>awk '$3 !~ /^[0-9]+\.[0-9]*$/ {print $0}' price.txt</tt></b></td>
<td></td>
<td>打印所有第三个字段不是数字的行，这里数字是指<tt>d.d</tt>或者<tt>d这样的形式，其中</tt><tt>d</tt>是0到9的任何数字</td>
</tr>
<tr valign="baseline">
<td><b><tt>awk '$2 ~ /John|Fred/ {print $0}' price.txt</tt></b></td>
<td></td>
<td>如果第二个字段包含&#8217;John&#8217;或者&#8217;Fred&#8217;则打印整行</td>
</tr>
</tbody>
</table>
<h2>grep</h2>
<p>grep是一个用来在一个或者多个文件或者输入流中使用RE进行查找的程序。它的name编程语言可以用来针对文件和管道进行处理。可以在手册中得到关于grep的完整信息。这个同样古怪的名字来源于vi的一个命令，<b><tt>g/</tt></b><i>re</i><b><tt>/p</tt></b>，意思是<b>g</b>lobal <b>r</b>egular <b>e</b>xpression <b>p</b>rint。
<p>下面的例子中我们假定在文件phone.txt中包含以下的文本，&mdash;&mdash;其格式是姓加一个逗号，然后是名，然后是一个制表符，然后是电话号码：</p>
<ul>
<p><tt>Francis, John&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5-3871</tt> <br/><tt>Wong, Fred&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4-4123</tt> <br/><tt>Jones, Thomas&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1-4122</tt> <br/><tt>Salazar, Richard&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5-2522</tt></p>
</ul>
<p>
<table>
<tbody>
<tr>
<td><b><i>grep命令</i></b></td>
<td><b><i>&nbsp;</i></b></td>
<td><b><i>描述</i></b></td>
</tr>
<tr>
<td>
<hr width="100%"/></td>
<td></td>
<td>
<hr width="100%"/></td>
</tr>
<tr valign="baseline">
<td><b><tt>grep '\t5-...1' phone.txt</tt></b></td>
<td></td>
<td>把所有电话号码以5开头以1结束的行打印出来，注意制表符是用<b><tt>\t</tt></b>表示的</td>
</tr>
<tr valign="baseline">
<td nowrap="65535"><b><tt>grep '^S[^ ]* R' phone.txt</tt></b></td>
<td></td>
<td>打印所有姓以S打头和名以R打头的行</td>
</tr>
<tr valign="baseline">
<td><b><tt>grep '^[JW]' phone.txt</tt></b></td>
<td></td>
<td>打印所有姓开头是J或者W的行</td>
</tr>
<tr valign="baseline">
<td><b><tt>grep ', ....\t' phone.txt</tt></b></td>
<td></td>
<td>打印所有姓是4个字符的行，注意制表符是用<b><tt>\t</tt></b>表示的</td>
</tr>
<tr valign="baseline">
<td><b><tt>grep -v '^[JW]' phone.txt</tt></b></td>
<td></td>
<td>打印所有不以J或者W开头的行</td>
</tr>
<tr valign="baseline">
<td><b><tt>grep '^[M-Z]' phone.txt</tt></b></td>
<td></td>
<td>打印所有姓的开头是M到Z之间任一字符的行</td>
</tr>
<tr valign="baseline">
<td><b><tt>grep '^[M-Z].*[12]' phone.txt</tt></b></td>
<td></td>
<td>打印所有姓的开头是M到Z之间任一字符，并且点号号码结尾是1或者2的行</td>
</tr>
</tbody>
</table>
<h2>egrep</h2>
<p>egrep是grep的一个扩展版本，它在它的正则表达式中支持更多的元字符。下面的例子中我们假定在文件phone.txt中包含以下的文本，&mdash;&mdash;其格式是姓加一个逗号，然后是名，然后是一个制表符，然后是电话号码：
<ul><tt>Francis, John&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5-3871</tt> <br/><tt>Wong, Fred&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4-4123</tt> <br/><tt>Jones, Thomas&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1-4122</tt> <br/><tt>Salazar, Richard&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5-2522</tt> </ul>
<p>
<table>
<tbody>
<tr>
<td><b><i>egrep command</i></b></td>
<td><b><i>&nbsp;</i></b></td>
<td><b><i>Description</i></b></td>
</tr>
<tr>
<td>
<hr width="100%"/></td>
<td></td>
<td>
<hr width="100%"/></td>
</tr>
<tr valign="baseline">
<td><b><tt>egrep '(John|Fred)' phone.txt</tt></b></td>
<td></td>
<td>打印所有包含名字<i>John</i>或者<i>Fred</i>的行</td>
</tr>
<tr valign="baseline">
<td nowrap="65535"><b><tt>egrep 'John|22$|^W' phone.txt</tt></b></td>
<td></td>
<td>打印所有包含<i>John</i> 或者以22结束或者以<i>W</i>的行</td>
</tr>
<tr>
<td><b><tt>egrep 'net(work)?s' report.txt</tt></b></td>
<td></td>
<td>从report.txt中找到所有包含<i>networks</i>或者<i>nets</i>的行</td>
</tr>
</tbody>
</table>
<h2>
<hr width="100%"/></h2>
<h1><a name="Regular Expressions Syntax"></a>正则表达式语法支持情况</h1>
<table cellspacing="0" border="1">
<tbody>
<tr>
<td><b>命令或环境</b></td>
<td><b><tt><font face="Courier New">.</font></tt></b></td>
<td><b><tt><font face="Courier New">[ ]</font></tt></b></td>
<td><b><tt><font face="Courier New">^</font></tt></b></td>
<td><b><tt><font face="Courier New">$</font></tt></b></td>
<td><b><tt><font face="Courier New">\( \)</font></tt></b></td>
<td><b><tt><font face="Courier New">\{ \}</font></tt></b></td>
<td><b><tt><font face="Courier New">?</font></tt></b></td>
<td><b><tt><font face="Courier New">+</font></tt></b></td>
<td><b><tt><font face="Courier New">|</font></tt></b></td>
<td><b><tt><font face="Courier New">( )</font></tt></b></td>
</tr>
<tr>
<td>vi</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Visual C++</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>awk</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
</tr>
<tr>
<td>sed</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Tcl</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
</tr>
<tr>
<td>ex</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>grep</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>egrep</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
</tr>
<tr>
<td>fgrep</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;X&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>perl</td>
<td>&nbsp;X</td>
<td>&nbsp;X</td>
<td>&nbsp;X</td>
<td>&nbsp;X</td>
<td>&nbsp;X</td>
<td>&nbsp;</td>
<td>&nbsp;X</td>
<td>&nbsp;X</td>
<td>&nbsp;X</td>
<td>&nbsp;X</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<hr/>
<h1><a name="ViSubstitutionCommandSyntax"></a>vi替换命令简介</h1>
<p>Vi的替换命令：
<ul><b><tt>:</tt></b><i>range</i><b><tt>s/</tt></b><i>pat1</i><b><tt>/</tt></b><i>pat2</i><b><tt>/g</tt></b> </ul>
<p>其中
<ul><b><tt>:</tt></b> 这是Vi的命令执行界面。 </ul>
<ul><i>range </i>是命令执行范围的指定，可以使用百分号（%）表示所有行，使用点（.）表示当前行，使用美元符号（$）表示最后一行。你还可以使用行号，例如<b><tt>10,20</tt></b>表示第10到20行，<b><tt>.,$</tt></b>表示当前行到最后一行，<b><tt>.+2,$-5</tt></b>表示当前行后两行直到全文的倒数第五行，等等。
<p><b><tt>s</tt></b> 表示其后是一个替换命令。</p>
<p><i>pat1 </i>这是要查找的一个正则表达式，这篇文章中有一大堆例子。</p>
</ul>
<ul><i>pat2 </i>这是希望把匹配串变成的模式的正则表达式，这篇文章中有一大堆例子。
<p><b><tt>g</tt></b> 可选标志，带这个标志表示替换将针对行中每个匹配的串进行，否则则只替换行中第一个匹配串。</p>
</ul>
<p>网上有很多vi的在线手册，你可以访问他们以获得更加完整的信息。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/guanvee/archive/2006/06/15/917105.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于google广告的问题，如果访问不了google，导致页面加载不下来的解决方法</title>
		<link>http://blog.donews.com/guanvee/archive/2006/06/06/905188.aspx</link>
		<comments>http://blog.donews.com/guanvee/archive/2006/06/06/905188.aspx#comments</comments>
		<pubDate>Tue, 06 Jun 2006 12:26:00 +0000</pubDate>
		<dc:creator>guanvee</dc:creator>
				<category><![CDATA[07--我的原创]]></category>

		<guid isPermaLink="false">http://blog.donews.com/guanvee/archive/2006/06/06/905188.aspx</guid>
		<description><![CDATA[最近经常上去google，导致在网站放的广告加载不下来，如果广告放的比较靠上，则整个页面都加载不下来<br/><br/>我 将此事告知google，给我的答复是：<br/><br/>&#8220;<br/><span style="color: rgb(0, 0, 255); font-style: italic;">感谢您的来信。</span><br style="color: rgb(0, 0, 255); font-style: italic;"/><br style="color: rgb(0, 0, 255); font-style: italic;"/><span style="color: rgb(0, 0, 255); font-style: italic;">感谢您通知我们您网站在加入我们代码之后影响到浏览速度 。我们目前正在尽最大努力查找此问题的根源。只要我们发现了更多信息，就会再次给您发送电子邮件。</span><br style="color: rgb(0, 0, 255); font-style: italic;"/><br style="color: rgb]]></description>
			<content:encoded><![CDATA[<p>最近经常上去google，导致在网站放的广告加载不下来，如果广告放的比较靠上，则整个页面都加载不下来<br/><br/>我 将此事告知google，给我的答复是：<br/><br/>&ldquo;<br/><span style="color: rgb(0, 0, 255); font-style: italic;">感谢您的来信。</span><br style="color: rgb(0, 0, 255); font-style: italic;"/><br style="color: rgb(0, 0, 255); font-style: italic;"/><span style="color: rgb(0, 0, 255); font-style: italic;">感谢您通知我们您网站在加入我们代码之后影响到浏览速度 。我们目前正在尽最大努力查找此问题的根源。只要我们发现了更多信息，就会再次给您发送电子邮件。</span><br style="color: rgb(0, 0, 255); font-style: italic;"/><br style="color: rgb(0, 0, 255); font-style: italic;"/><span style="color: rgb(0, 0, 255); font-style: italic;">在此期间，请按照以下的指示来看看效果是否比较好。</span><br style="color: rgb(0, 0, 255); font-style: italic;"/><br style="color: rgb(0, 0, 255); font-style: italic;"/><span style="color: rgb(0, 0, 255); font-style: italic;">在以下的广告宽度与高度输入您广告格式的大小，即 google_ad_width 与 google_ad_height 之后的数字：</span><br style="color: rgb(0, 0, 255); font-style: italic;"/><br style="color: rgb(0, 0, 255); font-style: italic;"/><span style="color: rgb(0, 0, 255); font-style: italic;">&#8212;&#8212;&#8212;-</span><br style="color: rgb(0, 0, 255); font-style: italic;"/><br style="color: rgb(0, 0, 255); font-style: italic;"/><span style="color: rgb(0, 0, 255); font-style: italic;">&lt;div id=&quot;googlead&quot; width=&quot;广告的宽度&quot; height=&quot;广告的高度&quot;&gt;&lt;/div&gt;</span><br style="color: rgb(0, 0, 255); font-style: italic;"/><span style="color: rgb(0, 0, 255); font-style: italic;">&lt;div id=&quot;googleadcode&quot; style=&quot;display:none&quot;&gt;</span><br style="color: rgb(0, 0, 255); font-style: italic;"/><br style="color: rgb(0, 0, 255); font-style: italic;"/><span style="color: rgb(0, 0, 255); font-style: italic;">在此贴入您的广告代码。贴入后请将此行删除</span><br style="color: rgb(0, 0, 255); font-style: italic;"/><br style="color: rgb(0, 0, 255); font-style: italic;"/><span style="color: rgb(0, 0, 255); font-style: italic;">&lt;/div&gt;</span><br style="color: rgb(0, 0, 255); font-style: italic;"/><span style="color: rgb(0, 0, 255); font-style: italic;">&lt;script language=&quot;javascript&quot;&gt;</span><br style="color: rgb(0, 0, 255); font-style: italic;"/><span style="color: rgb(0, 0, 255); font-style: italic;">if(document.all.item(&quot;googlead&quot;) != null)</span><br style="color: rgb(0, 0, 255); font-style: italic;"/><span style="color: rgb(0, 0, 255); font-style: italic;">{</span><br style="color: rgb(0, 0, 255); font-style: italic;"/><span style="color: rgb(0, 0, 255); font-style: italic;">googlead.innerHTML = googleadcode.innerHTML;</span><br style="color: rgb(0, 0, 255); font-style: italic;"/><span style="color: rgb(0, 0, 255); font-style: italic;">}</span><br style="color: rgb(0, 0, 255); font-style: italic;"/><span style="color: rgb(0, 0, 255); font-style: italic;">&lt;/script&gt;</span><br/><br/><br/><br/>&rdquo;<br/>将此代码放到网页中后还是会有问题，而且在firefox中就看不到广告正常显示了，于是我就改了一下他给我的代码如下：<br/><br/><br/><span style="color: rgb(255, 0, 0); font-weight: bold;">&lt;div id=&quot;googlead&quot; width=&quot;160&quot; height=&quot;600&quot; align=&quot;center&quot;&gt;&lt;/div&gt;</span><br/><span style="color: rgb(255, 153, 0);">－－－－－－－－－－－这一行放到原来的广告代码该放的地方</span><br/><br/><br/><span style="color: rgb(255, 0, 0);">&lt;div id=&quot;googleadcode&quot; style=&quot;display:none&quot;&gt;</span><br style="color: rgb(255, 0, 0);"/><span style="color: rgb(255, 0, 0); font-weight: bold;">&lt;!&#8211;这里放google adsense的广告代码，切勿修改，出了问题别找我哈&#8211;&gt; </span><br style="color: rgb(255, 0, 0);"/><span style="color: rgb(255, 0, 0);">&lt;/div&gt;</span><br style="color: rgb(255, 0, 0);"/><span style="color: rgb(255, 0, 0);">&lt;script language=&quot;javascript&quot;&gt;</span><br style="color: rgb(255, 0, 0);"/><span style="color: rgb(255, 0, 0);">if(document.getElementById(&quot;googlead&quot;) != null)</span><br style="color: rgb(255, 0, 0);"/><span style="color: rgb(255, 0, 0);">{</span><br style="color: rgb(255, 0, 0);"/><span style="color: rgb(255, 0, 0);">document.getElementById(&quot;googlead&quot;).innerHTML = document.getElementById(&quot;googleadcode&quot;).innerHTML;</span><br style="color: rgb(255, 0, 0);"/><span style="color: rgb(255, 0, 0);">}</span><br style="color: rgb(255, 0, 0);"/><span style="color: rgb(255, 0, 0);">&lt;/script&gt;</span><br/><span style="color: rgb(153, 204, 0);">－－－－－－－－－－－－－－－－－这些放到网页的最后边,仅在&lt;body&gt;标签前边。</span><br/><br/>这样不管google的广告能不能被加载，都会先把页面的其他元素加载下来才加载广告，当然也就出现了一个弊端就是广告最后才出来。<br/><br/>大家还有什么好的方法不妨交流交流。<br type="_moz"/></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/guanvee/archive/2006/06/06/905188.aspx/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>揭开正则表达式的神秘面纱</title>
		<link>http://blog.donews.com/guanvee/archive/2006/05/24/882865.aspx</link>
		<comments>http://blog.donews.com/guanvee/archive/2006/05/24/882865.aspx#comments</comments>
		<pubDate>Wed, 24 May 2006 02:51:00 +0000</pubDate>
		<dc:creator>guanvee</dc:creator>
				<category><![CDATA[13--其它收藏]]></category>

		<guid isPermaLink="false">http://blog.donews.com/guanvee/archive/2006/05/24/882865.aspx</guid>
		<description><![CDATA[<p><font size="1">[原创文章，转载请保留或注明出处：<a href="http://www.regexlab.com/zh/regref.htm">http://www.regexlab.com/zh/regref.htm</a>]</font></p><p><b>引言</b><br/><br/>&#160;&#160;&#160; 正则表达式（regular expression）描述了一种字符串匹配的模式，可以用来：（1）检查一个串中是否含有符合某个规则的子串，并且可以得到这个子串；（2）根据匹配规则对字符串进行灵活的替换操作。<br/><br/>&#160;&#160;&#160; 正则表达式学习起来其实是很简单的，不多的几个较为抽象的概念也很容易理解。之所以很多人感觉正则表达式比较复杂，一方面是因为大多数的文档没有做到由浅入深地讲解，概念上没有注意先后顺序，给读者的理解带来困难；另一方面，各种引擎自带的文档一般都要介绍它特有的功能，然而这部分特有的功能并不是我们首先要理解的。<br/><br/>&#160;&#160;&#160; 文章中的每一个举例，都可以点]]></description>
			<content:encoded><![CDATA[<p><font size="1">[原创文章，转载请保留或注明出处：<a href="http://www.regexlab.com/zh/regref.htm">http://www.regexlab.com/zh/regref.htm</a>]</font></p>
<p><b>引言</b><br/><br/>&nbsp;&nbsp;&nbsp; 正则表达式（regular expression）描述了一种字符串匹配的模式，可以用来：（1）检查一个串中是否含有符合某个规则的子串，并且可以得到这个子串；（2）根据匹配规则对字符串进行灵活的替换操作。<br/><br/>&nbsp;&nbsp;&nbsp; 正则表达式学习起来其实是很简单的，不多的几个较为抽象的概念也很容易理解。之所以很多人感觉正则表达式比较复杂，一方面是因为大多数的文档没有做到由浅入深地讲解，概念上没有注意先后顺序，给读者的理解带来困难；另一方面，各种引擎自带的文档一般都要介绍它特有的功能，然而这部分特有的功能并不是我们首先要理解的。<br/><br/>&nbsp;&nbsp;&nbsp; 文章中的每一个举例，都可以点击进入到测试页面进行测试。闲话少说，开始。</p>
<hr color="#fea089" size="1"/>
<p><b>1. 正则表达式规则</b></p>
<p><b><a name="common"></a>1.1 普通字符</b></p>
<p>&nbsp;&nbsp;&nbsp; 字母、数字、汉字、下划线、以及后边章节中没有特殊定义的标点符号，都是&quot;普通字符&quot;。表达式中的普通字符，在匹配一个字符串的时候，匹配与之相同的一个字符。<br/><br/>&nbsp;&nbsp;&nbsp; <a href="http://www.regexlab.com/zh/workshop.asp?pat=c&amp;txt=abcde">举例1：表达式 &quot;c&quot;，在匹配字符串 &quot;abcde&quot; 时</a>，匹配结果是：成功；匹配到的内容是：&quot;c&quot;；匹配到的位置是：开始于2，结束于3。（注：下标从0开始还是从1开始，因当前编程语言的不同而可能不同）<br/><br/>&nbsp;&nbsp;&nbsp; <a href="http://www.regexlab.com/zh/workshop.asp?pat=bcd&amp;txt=abcde">举例2：表达式 &quot;bcd&quot;，在匹配字符串 &quot;abcde&quot; 时</a>，匹配结果是：成功；匹配到的内容是：&quot;bcd&quot;；匹配到的位置是：开始于1，结束于4。</p>
<hr color="#fea089" size="1"/>
<p><b><a name="escaped"></a>1.2 简单的转义字符</b></p>
<p>&nbsp;&nbsp;&nbsp; 一些不便书写的字符，采用在前面加 &quot;\&quot; 的方法。这些字符其实我们都已经熟知了。</p>
<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
<tbody>
<tr bgcolor="#f0f0f0">
<td width="70">
<p>表达式</p>
</td>
<td>
<p>可匹配</p>
</td>
</tr>
<tr>
<td>
<p>\r, \n</p>
</td>
<td>
<p>代表回车和换行符</p>
</td>
</tr>
<tr>
<td>
<p>\t</p>
</td>
<td>
<p>制表符</p>
</td>
</tr>
<tr>
<td>
<p>\\</p>
</td>
<td>
<p>代表 &quot;\&quot; 本身</p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;&nbsp;&nbsp; 还有其他一些在后边章节中有特殊用处的标点符号，在前面加 &quot;\&quot; 后，就代表该符号本身。比如：^, $ 都有特殊意义，如果要想匹配字符串中 &quot;^&quot; 和 &quot;$&quot; 字符，则表达式就需要写成 &quot;\^&quot; 和 &quot;\$&quot;。</p>
<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
<tbody>
<tr bgcolor="#f0f0f0">
<td width="66">
<p>表达式</p>
</td>
<td>
<p>可匹配</p>
</td>
</tr>
<tr>
<td>
<p>\^</p>
</td>
<td>
<p>匹配 ^ 符号本身</p>
</td>
</tr>
<tr>
<td>
<p>\$</p>
</td>
<td>
<p>匹配 $ 符号本身</p>
</td>
</tr>
<tr>
<td>
<p>\.</p>
</td>
<td>
<p>匹配小数点（.）本身</p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;&nbsp;&nbsp; 这些转义字符的匹配方法与 &quot;普通字符&quot; 是类似的。也是匹配与之相同的一个字符。<br/><br/>&nbsp;&nbsp;&nbsp; <a href="http://www.regexlab.com/zh/workshop.asp?pat=%5C$d&amp;txt=abc$de">举例1：表达式 &quot;\$d&quot;，在匹配字符串 &quot;abc$de&quot; 时</a>，匹配结果是：成功；匹配到的内容是：&quot;$d&quot;；匹配到的位置是：开始于3，结束于5。</p>
<hr color="#fea089" size="1"/>
<p><b><a name="multi"></a>1.3 能够与 &#8216;多种字符&#8217; 匹配的表达式</b></p>
<p>&nbsp;&nbsp;&nbsp; 正则表达式中的一些表示方法，可以匹配 &#8216;多种字符&#8217; 其中的任意一个字符。比如，表达式 &quot;\d&quot; 可以匹配任意一个数字。虽然可以匹配其中任意字符，但是只能是一个，不是多个。这就好比玩扑克牌时候，大小王可以代替任意一张牌，但是只能代替一张牌。</p>
<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
<tbody>
<tr bgcolor="#f0f0f0">
<td width="66">
<p>表达式</p>
</td>
<td>
<p>可匹配</p>
</td>
</tr>
<tr>
<td>
<p>\d</p>
</td>
<td>
<p>任意一个数字，0~9 中的任意一个</p>
</td>
</tr>
<tr>
<td>
<p>\w</p>
</td>
<td>
<p>任意一个字母或数字或下划线，也就是 A~Z,a~z,0~9,_ 中任意一个</p>
</td>
</tr>
<tr>
<td>
<p>\s</p>
</td>
<td>
<p>包括空格、制表符、换页符等空白字符的其中任意一个</p>
</td>
</tr>
<tr>
<td>
<p>.</p>
</td>
<td>
<p>小数点可以匹配除了换行符（\n）以外的任意一个字符</p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;&nbsp;&nbsp; <a href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cd%5Cd&amp;txt=abc123">举例1：表达式 &quot;\d\d&quot;，在匹配 &quot;abc123&quot; 时</a>，匹配的结果是：成功；匹配到的内容是：&quot;12&quot;；匹配到的位置是：开始于3，结束于5。<br/><br/>&nbsp;&nbsp;&nbsp; <a href="http://www.regexlab.com/zh/workshop.asp?pat=a.%5Cd&amp;txt=aaa100">举例2：表达式 &quot;a.\d&quot;，在匹配 &quot;aaa100&quot; 时</a>，匹配的结果是：成功；匹配到的内容是：&quot;aa1&quot;；匹配到的位置是：开始于1，结束于4。</p>
<hr color="#fea089" size="1"/>
<p><b><a name="custom"></a>1.4 自定义能够匹配 &#8216;多种字符&#8217; 的表达式</b></p>
<p>&nbsp;&nbsp;&nbsp; 使用方括号 [ ] 包含一系列字符，能够匹配其中任意一个字符。用 [^ ] 包含一系列字符，则能够匹配其中字符之外的任意一个字符。同样的道理，虽然可以匹配其中任意一个，但是只能是一个，不是多个。</p>
<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
<tbody>
<tr bgcolor="#f0f0f0">
<td width="80">
<p>表达式</p>
</td>
<td>
<p>可匹配</p>
</td>
</tr>
<tr>
<td>
<p>[ab5@]</p>
</td>
<td>
<p>匹配 &quot;a&quot; 或 &quot;b&quot; 或 &quot;5&quot; 或 &quot;@&quot;</p>
</td>
</tr>
<tr>
<td>
<p>[^abc]</p>
</td>
<td>
<p>匹配 &quot;a&quot;,&quot;b&quot;,&quot;c&quot; 之外的任意一个字符</p>
</td>
</tr>
<tr>
<td>
<p>[f-k]</p>
</td>
<td>
<p>匹配 &quot;f&quot;~&quot;k&quot; 之间的任意一个字母</p>
</td>
</tr>
<tr>
<td>
<p>[^A-F0-3]</p>
</td>
<td>
<p>匹配 &quot;A&quot;~&quot;F&quot;,&quot;0&quot;~&quot;3&quot; 之外的任意一个字符</p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;&nbsp;&nbsp; <a href="http://www.regexlab.com/zh/workshop.asp?pat=[bcd][bcd]&amp;txt=abc123">举例1：表达式 &quot;[bcd][bcd]&quot; 匹配 &quot;abc123&quot; 时</a>，匹配的结果是：成功；匹配到的内容是：&quot;bc&quot;；匹配到的位置是：开始于1，结束于3。<br/><br/>&nbsp;&nbsp;&nbsp; <a href="http://www.regexlab.com/zh/workshop.asp?pat=%5B%5Eabc%5D&amp;txt=abc123">举例2：表达式 &quot;[^abc]&quot; 匹配 &quot;abc123&quot; 时</a>，匹配的结果是：成功；匹配到的内容是：&quot;1&quot;；匹配到的位置是：开始于3，结束于4。</p>
<hr color="#fea089" size="1"/>
<p><b><a name="times"></a>1.5 修饰匹配次数的特殊符号</b></p>
<p>&nbsp;&nbsp;&nbsp; 前面章节中讲到的表达式，无论是只能匹配一种字符的表达式，还是可以匹配多种字符其中任意一个的表达式，都只能匹配一次。如果使用表达式再加上修饰匹配次数的特殊符号，那么不用重复书写表达式就可以重复匹配。<br/><br/>&nbsp;&nbsp;&nbsp; 使用方法是：&quot;次数修饰&quot;放在&quot;被修饰的表达式&quot;后边。比如：&quot;[bcd][bcd]&quot; 可以写成 &quot;[bcd]{2}&quot;。</p>
<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
<tbody>
<tr bgcolor="#f0f0f0">
<td width="67">
<p>表达式</p>
</td>
<td>
<p>作用</p>
</td>
</tr>
<tr>
<td>
<p>{n}</p>
</td>
<td>
<p>表达式重复n次，比如：<a href="http://www.regexlab.com/zh/workshop.asp?pat=\w{2}&amp;txt=ab+c6">&quot;\w{2}&quot; 相当于 &quot;\w\w&quot;</a>；<a href="http://www.regexlab.com/zh/workshop.asp?pat=a{5}&amp;txt=bbaaaaaddee">&quot;a{5}&quot; 相当于 &quot;aaaaa&quot;</a></p>
</td>
</tr>
<tr>
<td>
<p>{m,n}</p>
</td>
<td>
<p>表达式至少重复m次，最多重复n次，比如：<a href="http://www.regexlab.com/zh/workshop.asp?pat=ba{1,3}&amp;txt=a,baaa,baa,b,ba">&quot;ba{1,3}&quot;可以匹配 &quot;ba&quot;或&quot;baa&quot;或&quot;baaa&quot;</a></p>
</td>
</tr>
<tr>
<td>
<p>{m,}</p>
</td>
<td>
<p>表达式至少重复m次，比如：<a href="http://www.regexlab.com/zh/workshop.asp?pat=\w\d{2,}&amp;txt=b1,a12,_456,_4AA,M12344,12346546547446534543543">&quot;\w\d{2,}&quot;可以匹配 &quot;a12&quot;,&quot;_456&quot;,&quot;M12344&quot;&#8230;</a></p>
</td>
</tr>
<tr>
<td>
<p>?</p>
</td>
<td>
<p>匹配表达式0次或者1次，相当于 {0,1}，比如：<a href="http://www.regexlab.com/zh/workshop.asp?pat=a[cd]%3F&amp;txt=a,c,d,ac,ad">&quot;a[cd]?&quot;可以匹配 &quot;a&quot;,&quot;ac&quot;,&quot;ad&quot;</a></p>
</td>
</tr>
<tr>
<td>
<p>+</p>
</td>
<td>
<p>表达式至少出现1次，相当于 {1,}，比如：<a href="http://www.regexlab.com/zh/workshop.asp?pat=a%2Bb&amp;txt=a%2Cb%2Cab%2Caab%2Caaab">&quot;a+b&quot;可以匹配 &quot;ab&quot;,&quot;aab&quot;,&quot;aaab&quot;&#8230;</a></p>
</td>
</tr>
<tr>
<td>
<p>*</p>
</td>
<td>
<p>表达式不出现或出现任意次，相当于 {0,}，比如：<a href="http://www.regexlab.com/zh/workshop.asp?pat=%5C%5E*b&amp;txt=%5E%2Cb%2C%5E%5E%5Eb%2C%5E%5E%5E%5E%5E%5E%5Eb">&quot;\^*b&quot;可以匹配 &quot;b&quot;,&quot;^^^b&quot;&#8230;</a></p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;&nbsp;&nbsp; <a href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cd%2B%5C.%3F%5Cd*&amp;txt=It%20costs%20%2412.5">举例1：表达式 &quot;\d+\.?\d*&quot; 在匹配 &quot;It costs $12.5&quot; 时</a>，匹配的结果是：成功；匹配到的内容是：&quot;12.5&quot;；匹配到的位置是：开始于10，结束于14。<br/><br/>&nbsp;&nbsp;&nbsp; <a href="http://www.regexlab.com/zh/workshop.asp?pat=go{2,8}gle&amp;txt=Ads%20by%20goooooogle%2C%20or%20gooogle">举例2：表达式 &quot;go{2,8}gle&quot; 在匹配 &quot;Ads by goooooogle&quot; 时</a>，匹配的结果是：成功；匹配到的内容是：&quot;goooooogle&quot;；匹配到的位置是：开始于7，结束于17。</p>
<hr color="#fea089" size="1"/>
<p><b><a name="special"></a>1.6 其他一些代表抽象意义的特殊符号</b></p>
<p>&nbsp;&nbsp;&nbsp; 一些符号在表达式中代表抽象的特殊意义：</p>
<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
<tbody>
<tr bgcolor="#f0f0f0">
<td width="67">
<p>表达式</p>
</td>
<td>
<p>作用</p>
</td>
</tr>
<tr>
<td>
<p>^</p>
</td>
<td>
<p>与字符串开始的地方匹配，不匹配任何字符</p>
</td>
</tr>
<tr>
<td>
<p>$</p>
</td>
<td>
<p>与字符串结束的地方匹配，不匹配任何字符</p>
</td>
</tr>
<tr>
<td>
<p>\b</p>
</td>
<td>
<p>匹配一个单词边界，也就是单词和空格之间的位置，不匹配任何字符</p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;&nbsp;&nbsp; 进一步的文字说明仍然比较抽象，因此，举例帮助大家理解。<br/><br/>&nbsp;&nbsp;&nbsp; <a href="http://www.regexlab.com/zh/workshop.asp?pat=^aaa&amp;txt=xxx+aaa+xxx">举例1：表达式 &quot;^aaa&quot; 在匹配 &quot;xxx aaa xxx&quot; 时</a>，匹配结果是：失败。因为 &quot;^&quot; 要求与字符串开始的地方匹配，因此，只有当 &quot;aaa&quot; 位于字符串的开头的时候，&quot;^aaa&quot; 才能匹配，<a href="http://www.regexlab.com/zh/workshop.asp?pat=^aaa&amp;txt=aaa+xxx+xxx">比如：&quot;aaa xxx xxx&quot;</a>。<br/><br/>&nbsp;&nbsp;&nbsp; <a href="http://www.regexlab.com/zh/workshop.asp?pat=aaa$&amp;txt=xxx+aaa+xxx">举例2：表达式 &quot;aaa$&quot; 在匹配 &quot;xxx aaa xxx&quot; 时</a>，匹配结果是：失败。因为 &quot;$&quot; 要求与字符串结束的地方匹配，因此，只有当 &quot;aaa&quot; 位于字符串的结尾的时候，&quot;aaa$&quot; 才能匹配，<a href="http://www.regexlab.com/zh/workshop.asp?pat=aaa$&amp;txt=xxx+xxx+aaa">比如：&quot;xxx xxx aaa&quot;</a>。<br/><br/>&nbsp;&nbsp;&nbsp; <a href="http://www.regexlab.com/zh/workshop.asp?pat=.%5Cb.&amp;txt=@@@abc">举例3：表达式 &quot;.\b.&quot; 在匹配 &quot;@@@abc&quot; 时</a>，匹配结果是：成功；匹配到的内容是：&quot;@a&quot;；匹配到的位置是：开始于2，结束于4。<br/>&nbsp;&nbsp;&nbsp; 进一步说明：&quot;\b&quot; 与 &quot;^&quot; 和 &quot;$&quot; 类似，本身不匹配任何字符，但是它要求它在匹配结果中所处位置的左右两边，其中一边是 &quot;\w&quot; 范围，另一边是 非&quot;\w&quot; 的范围。<br/><br/>&nbsp;&nbsp;&nbsp; <a href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cbend%5Cb&amp;txt=weekend,endfor,end">举例4：表达式 &quot;\bend\b&quot; 在匹配 &quot;weekend,endfor,end&quot; 时</a>，匹配结果是：成功；匹配到的内容是：&quot;end&quot;；匹配到的位置是：开始于15，结束于18。</p>
<p>&nbsp;&nbsp;&nbsp; 一些符号可以影响表达式内部的子表达式之间的关系：</p>
<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
<tbody>
<tr bgcolor="#f0f0f0">
<td width="65">
<p>表达式</p>
</td>
<td>
<p>作用</p>
</td>
</tr>
<tr>
<td>
<p>|</p>
</td>
<td>
<p>左右两边表达式之间 &quot;或&quot; 关系，匹配左边或者右边</p>
</td>
</tr>
<tr>
<td>
<p>( )</p>
</td>
<td>
<p>(1). 在被修饰匹配次数的时候，括号中的表达式可以作为整体被修饰<br/>(2). 取匹配结果的时候，括号中的表达式匹配到的内容可以被单独得到</p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;&nbsp;&nbsp; <a href="http://www.regexlab.com/zh/workshop.asp?pat=Tom%7CJack&amp;txt=I%27m+Tom%2C+he+is+Jack">举例5：表达式 &quot;Tom|Jack&quot; 在匹配字符串 &quot;I&#8217;m Tom, he is Jack&quot; 时</a>，匹配结果是：成功；匹配到的内容是：&quot;Tom&quot;；匹配到的位置是：开始于4，结束于7。匹配下一个时，匹配结果是：成功；匹配到的内容是：&quot;Jack&quot;；匹配到的位置时：开始于15，结束于19。<br/><br/>&nbsp;&nbsp;&nbsp; <a href="http://www.regexlab.com/zh/workshop.asp?pat=%28go%5Cs*%29%2B&amp;txt=Let%27s%20go%20go%20go%21">举例6：表达式 &quot;(go\s*)+&quot; 在匹配 &quot;Let&#8217;s go go go!&quot; 时</a>，匹配结果是：成功；匹配到内容是：&quot;go go go&quot;；匹配到的位置是：开始于6，结束于14。<br/><br/>&nbsp;&nbsp;&nbsp; <a href="http://www.regexlab.com/zh/workshop.asp?pat=%uFFE5%28%5Cd%2B%5C.%3F%5Cd*%29&amp;txt=%uFF0410.9%2C%uFFE520.5">举例7：表达式 &quot;￥(\d+\.?\d*)&quot; 在匹配 &quot;＄10.9,￥20.5&quot; 时</a>，匹配的结果是：成功；匹配到的内容是：&quot;￥20.5&quot;；匹配到的位置是：开始于6，结束于10。单独获取括号范围匹配到的内容是：&quot;20.5&quot;。</p>
<hr color="#fea089" size="1"/>
<p><b>2. 正则表达式中的一些高级规则</b></p>
<p><b><a name="reluctant"></a>2.1 匹配次数中的贪婪与非贪婪</b></p>
<p>&nbsp;&nbsp;&nbsp; 在使用修饰匹配次数的特殊符号时，有几种表示方法可以使同一个表达式能够匹配不同的次数，比如：&quot;{m,n}&quot;, &quot;{m,}&quot;, &quot;?&quot;, &quot;*&quot;, &quot;+&quot;，具体匹配的次数随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程中，总是尽可能多的匹配。比如，针对文本 &quot;dxxxdxxxd&quot;，举例如下：</p>
<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
<tbody>
<tr bgcolor="#f0f0f0">
<td width="93">
<p>表达式</p>
</td>
<td>
<p>匹配结果</p>
</td>
</tr>
<tr>
<td>
<p><a href="http://www.regexlab.com/zh/workshop.asp?pat=(d)(%5Cw%2B)&amp;txt=dxxxdxxxd">(d)(\w+)</a></p>
</td>
<td>
<p>&quot;\w+&quot; 将匹配第一个 &quot;d&quot; 之后的所有字符 &quot;xxxdxxxd&quot;</p>
</td>
</tr>
<tr>
<td>
<p><a href="http://www.regexlab.com/zh/workshop.asp?pat=(d)(%5Cw%2B)(d)&amp;txt=dxxxdxxxd">(d)(\w+)(d)</a></p>
</td>
<td>
<p>&quot;\w+&quot; 将匹配第一个 &quot;d&quot; 和最后一个 &quot;d&quot; 之间的所有字符 &quot;xxxdxxx&quot;。虽然 &quot;\w+&quot; 也能够匹配上最后一个 &quot;d&quot;，但是为了使整个表达式匹配成功，&quot;\w+&quot; 可以 &quot;让出&quot; 它本来能够匹配的最后一个 &quot;d&quot;</p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;&nbsp;&nbsp; 由此可见，&quot;\w+&quot; 在匹配的时候，总是尽可能多的匹配符合它规则的字符。虽然第二个举例中，它没有匹配最后一个 &quot;d&quot;，但那也是为了让整个表达式能够匹配成功。同理，带 &quot;*&quot; 和 &quot;{m,n}&quot; 的表达式都是尽可能地多匹配，带 &quot;?&quot; 的表达式在可匹配可不匹配的时候，也是尽可能的 &quot;要匹配&quot;。这 种匹配原则就叫作 &quot;贪婪&quot; 模式 。</p>
<p>&nbsp;&nbsp;&nbsp; 非贪婪模式：<br/><br/>&nbsp;&nbsp;&nbsp; 在修饰匹配次数的特殊符号后再加上一个 &quot;?&quot; 号，则可以使匹配次数不定的表达式尽可能少的匹配，使可匹配可不匹配的表达式，尽可能的 &quot;不匹配&quot;。这种匹配原则叫作 &quot;非贪婪&quot; 模式，也叫作 &quot;勉强&quot; 模式。如果少匹配就会导致整个表达式匹配失败的时候，与贪婪模式类似，非贪婪模式会最小限度的再匹配一些，以使整个表达式匹配成功。举例如下，针对文本 &quot;dxxxdxxxd&quot; 举例：</p>
<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
<tbody>
<tr bgcolor="#f0f0f0">
<td width="93">
<p>表达式</p>
</td>
<td>
<p>匹配结果</p>
</td>
</tr>
<tr>
<td>
<p><a href="http://www.regexlab.com/zh/workshop.asp?pat=(d)(%5Cw%2B%3F)&amp;txt=dxxxdxxxd">(d)(\w+?)</a></p>
</td>
<td>
<p>&quot;\w+?&quot; 将尽可能少的匹配第一个 &quot;d&quot; 之后的字符，结果是：&quot;\w+?&quot; 只匹配了一个 &quot;x&quot;</p>
</td>
</tr>
<tr>
<td>
<p><a href="http://www.regexlab.com/zh/workshop.asp?pat=(d)(%5Cw%2B%3F)(d)&amp;txt=dxxxdxxxd">(d)(\w+?)(d)</a></p>
</td>
<td>
<p>为了让整个表达式匹配成功，&quot;\w+?&quot; 不得不匹配 &quot;xxx&quot; 才可以让后边的 &quot;d&quot; 匹配，从而使整个表达式匹配成功。因此，结果是：&quot;\w+?&quot; 匹配 &quot;xxx&quot;</p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;&nbsp;&nbsp; 更多的情况，举例如下：<br/><br/>&nbsp;&nbsp;&nbsp; <a href="http://www.regexlab.com/zh/workshop.asp?pat=%3Ctd%3E%28%2E%2A%29%3C%2Ftd%3E&amp;txt=%3Ctd%3E%3Cp%3Eaa%3C%2Fp%3E%3C%2Ftd%3E%3Ctd%3E%3Cp%3Ebb%3C%2Fp%3E%3C%2Ftd%3E">举例1：表达式 &quot;&lt;td&gt;(.*)&lt;/td&gt;&quot; 与字符串 &quot;&lt;td&gt;&lt;p&gt;aa&lt;/p&gt;&lt;/td&gt; &lt;td&gt;&lt;p&gt;bb&lt;/p&gt;&lt;/td&gt;&quot; 匹配时</a>，匹配的结果是：成功；匹配到的内容是 &quot;&lt;td&gt;&lt;p&gt;aa&lt;/p&gt;&lt;/td&gt; &lt;td&gt;&lt;p&gt;bb&lt;/p&gt;&lt;/td&gt;&quot; 整个字符串， 表达式中的 &quot;&lt;/td&gt;&quot; 将与字符串中最后一个 &quot;&lt;/td&gt;&quot; 匹配。 <br/><br/>&nbsp;&nbsp;&nbsp; <a href="http://www.regexlab.com/zh/workshop.asp?pat=%3Ctd%3E%28%2E%2A%3F%29%3C%2Ftd%3E&amp;txt=%3Ctd%3E%3Cp%3Eaa%3C%2Fp%3E%3C%2Ftd%3E%3Ctd%3E%3Cp%3Ebb%3C%2Fp%3E%3C%2Ftd%3E">举例2：相比之下，表达式 &quot;&lt;td&gt;(.*?)&lt;/td&gt;&quot; 匹配举例1中同样的字符串时</a>，将只得到 &quot;&lt;td&gt;&lt;p&gt;aa&lt;/p&gt;&lt;/td&gt;&quot;， 再次匹配下一个时，可以得到第二个 &quot;&lt;td&gt;&lt;p&gt;bb&lt;/p&gt;&lt;/td&gt;&quot;。</p>
<hr color="#fea089" size="1"/>
<p><b><a name="backref"></a>2.2 反向引用 \1, \2&#8230;</b></p>
<p>&nbsp;&nbsp;&nbsp; 表达式在匹配时，表达式引擎会将小括号 &quot;( )&quot; 包含的表达式所匹配到的字符串记录下来。在获取匹配结果的时候，小括号包含的表达式所匹配到的字符串可以单独获取。这一点，在前面的举例中，已经多次展示了。在实际应用场合中，当用某种边界来查找，而所要获取的内容又不包含边界时，必须使用小括号来指定所要的范围。比如前面的 &quot;&lt;td&gt;(.*?)&lt;/td&gt;&quot;。<br/><br/>&nbsp;&nbsp;&nbsp; 其实，&quot;小括号包含的表达式所匹配到的字符串&quot; 不仅是在匹配结束后才可以使用，在匹配过程中也可以使用。表达式后边的部分，可以引用前面 &quot;括号内的子匹配已经匹配到的字符串&quot;。引用方法是 &quot;\&quot; 加上一个数字。&quot;\1&quot; 引用第1对括号内匹配到的字符串，&quot;\2&quot; 引用第2对括号内匹配到的字符串&hellip;&hellip;以此类推，如果一对括号内包含另一对括号，则外层的括号先排序号。换句话说，哪一对的左括号 &quot;(&quot; 在前，那这一对就先排序号。</p>
<p>&nbsp;&nbsp;&nbsp; 举例如下：<br/><br/>&nbsp;&nbsp;&nbsp; <a href="http://www.regexlab.com/zh/workshop.asp?pat=%28%27%7C%22%29%28%2E%2A%3F%29%28%5C1%29&amp;txt=%27Hello%27%2C+%22World%22">举例1：表达式 &quot;(&#8216;|&quot;)(.*?)(\1)&quot; 在匹配 &quot; &#8216;Hello&#8217;, &quot;World&quot; &quot; 时</a>，匹配结果是：成功；匹配到的内容是：&quot; &#8216;Hello&#8217; &quot;。再次匹配下一个时，可以匹配到 &quot; &quot;World&quot; &quot;。<br/><br/>&nbsp;&nbsp;&nbsp; <a href="http://www.regexlab.com/zh/workshop.asp?pat=%28%5Cw%29%5C1%7B4%2C%7D&amp;txt=aa%20bbbb%20abcdefg%20ccccc%20111121111%20999999999">举例2：表达式 &quot;(\w)\1{4,}&quot; 在匹配 &quot;aa bbbb abcdefg ccccc 111121111 999999999&quot; 时</a>，匹配结果是：成功；匹配到的内容是 &quot;ccccc&quot;。再次匹配下一个时，将得到 999999999。这个表达式要求 &quot;\w&quot; 范围的字符至少重复5次，<a href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cw%7B5%2C%7D&amp;txt=aa%20bbbb%20abcdefg%20ccccc%20111121111%20999999999">注意与 &quot;\w{5,}&quot; 之间的区别</a>。<br/><br/>&nbsp;&nbsp;&nbsp; <a href="http://www.regexlab.com/zh/workshop.asp?pat=%3C%28%5Cw%2B%29%5Cs%2A%28%5Cw%2B%28%3D%28%27%7C%22%29%2E%2A%3F%5C4%29%3F%5Cs%2A%29%2A%3E%2E%2A%3F%3C%2F%5C1%3E&amp;txt=%3Ctd+id%3D%27td1%27+style%3D%22bgcolor%3Awhite%22%3E%3C%2Ftd%3E%0D%0A%3Cbody+onload%3D%22doit%28%29%22%3E%3C%2Fbody%3E">举例3：表达式 &quot;&lt;(\w+)\s*(\w+(=(&#8216;|&quot;).*?\4)?\s*)*&gt;.*?&lt;/\1&gt;&quot; 在匹配 &quot;&lt;td id=&#8217;td1&#8242; style=&quot;bgcolor:white&quot;&gt;&lt;/td&gt;&quot; 时</a>，匹配结果是成功。如果 &quot;&lt;td&gt;&quot; 与 &quot;&lt;/td&gt;&quot; 不配对，则会匹配失败；如果改成其他配对，也可以匹配成功。</p>
<hr color="#fea089" size="1"/>
<p><b><a name="forward"></a>2.3 预搜索，不匹配；反向预搜索，不匹配</b></p>
<p>&nbsp;&nbsp;&nbsp; 前面的章节中，我讲到了几个代表抽象意义的特殊符号：&quot;^&quot;，&quot;$&quot;，&quot;\b&quot;。它们都有一个共同点，那就是：它们本身不匹配任何字符，只是对 &quot;字符串的两头&quot; 或者 &quot;字符之间的缝隙&quot; 附加了一个条件。理解到这个概念以后，本节将继续介绍另外一种对 &quot;两头&quot; 或者 &quot;缝隙&quot; 附加条件的，更加灵活的表示方法。</p>
<p>&nbsp;&nbsp;&nbsp; 正向预搜索：&quot;(?=xxxxx)&quot;，&quot;(?!xxxxx)&quot;<br/><br/>&nbsp;&nbsp;&nbsp; 格式：&quot;(?=xxxxx)&quot;，在被匹配的字符串中，它对所处的 &quot;缝隙&quot; 或者 &quot;两头&quot; 附加的条件是：所在缝隙的右侧，必须能够匹配上 xxxxx 这部分的表达式。因为它只是在此作为这个缝隙上附加的条件，所以它并不影响后边的表达式去真正匹配这个缝隙之后的字符。这就类似 &quot;\b&quot;，本身不匹配任何字符。&quot;\b&quot; 只是将所在缝隙之前、之后的字符取来进行了一下判断，不会影响后边的表达式来真正的匹配。<br/><br/>&nbsp;&nbsp;&nbsp; <a href="http://www.regexlab.com/zh/workshop.asp?pat=Windows+%28%3F%3DNT%7CXP%29&amp;txt=Windows+98%2C+Windows+NT%2C+Windows+2000">举例1：表达式 &quot;Windows (?=NT|XP)&quot; 在匹配 &quot;Windows 98, Windows NT, Windows 2000&quot; 时</a>，将只匹配 &quot;Windows NT&quot; 中的 &quot;Windows &quot;，其他的 &quot;Windows &quot; 字样则不被匹配。<br/><br/>&nbsp;&nbsp;&nbsp; <a href="http://www.regexlab.com/zh/workshop.asp?pat=%28%5Cw%29%28%28%3F%3D%5C1%5C1%5C1%29%28%5C1%29%29%2B&amp;txt=aaa+ffffff+999999999">举例2：表达式 &quot;(\w)((?=\1\1\1)(\1))+&quot; 在匹配字符串 &quot;aaa ffffff 999999999&quot; 时</a>，将可以匹配6个&quot;f&quot;的前4个，可以匹配9个&quot;9&quot;的前7个。这个表达式可以读解成：重复4次以上的字母数字，则匹配其剩下最后2位之前的部分。当然，这个表达式可以不这样写，在此的目的是作为演示之用。</p>
<p>&nbsp;&nbsp;&nbsp; 格式：&quot;(?!xxxxx)&quot;，所在缝隙的右侧，必须不能匹配 xxxxx 这部分表达式。<br/><br/>&nbsp;&nbsp;&nbsp; <a href="http://www.regexlab.com/zh/workshop.asp?pat=%28%28%3F%21%5Cbstop%5Cb%29%2E%29%2B&amp;txt=fdjka+ljfdl+stop+fjdsla+fdj">举例3：表达式 &quot;((?!\bstop\b).)+&quot; 在匹配 &quot;fdjka ljfdl stop fjdsla fdj&quot; 时</a>，将从头一直匹配到 &quot;stop&quot; 之前的位置，如果字符串中没有 &quot;stop&quot;，则匹配整个字符串。<br/><br/>&nbsp;&nbsp;&nbsp; <a href="http://www.regexlab.com/zh/workshop.asp?pat=do%28%3F%21%5Cw%29&amp;txt=done%2C+do%2C+dog">举例4：表达式 &quot;do(?!\w)&quot; 在匹配字符串 &quot;done, do, dog&quot; 时</a>，只能匹配 &quot;do&quot;。在本条举例中，&quot;do&quot; 后边使用 &quot;(?!\w)&quot; 和使用 &quot;\b&quot; 效果是一样的。</p>
<p>&nbsp;&nbsp;&nbsp; 反向预搜索：&quot;(?&lt;=xxxxx)&quot;，&quot;(?&lt;!xxxxx)&quot;<br/><br/>&nbsp;&nbsp;&nbsp; 这两种格式的概念和正向预搜索是类似的，反向预搜索要求的条件是：所在缝隙的 &quot;左侧&quot;，两种格式分别要求必须能够匹配和必须不能够匹配指定表达式，而不是去判断右侧。与 &quot;正向预搜索&quot; 一样的是：它们都是对所在缝隙的一种附加条件，本身都不匹配任何字符。<br/><br/>&nbsp;&nbsp;&nbsp; 举例5：表达式 &quot;(?&lt;=\d{4})\d+(?=\d{4})&quot; 在匹配 &quot;1234567890123456&quot; 时，将匹配除了前4个数字和后4个数字之外的中间8个数字。由于 JScript.RegExp 不支持反向预搜索，因此，本条举例不能够进行演示。很多其他的引擎可以支持反向预搜索，比如：Java 1.4 以上的 java.util.regex 包，.NET 中System.Text.RegularExpressions 命名空间，boost::regex 以及 <a href="http://www.nk975.com/sswater/zh/greta/index.htm">GRETA 正则表达式库</a>等。</p>
<hr color="#fea089" size="1"/>
<p><b><a name="othercommon"></a>3. 其他通用规则</b></p>
<p>&nbsp;&nbsp;&nbsp; 还有一些在各个正则表达式引擎之间比较通用的规则，在前面的讲解过程中没有提到。</p>
<p>3.1 表达式中，可以使用 &quot;\xXX&quot; 和 &quot;\uXXXX&quot; 表示一个字符（&quot;X&quot; 表示一个十六进制数）</p>
<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
<tbody>
<tr bgcolor="#f0f0f0">
<td width="63">
<p>形式</p>
</td>
<td>
<p>字符范围</p>
</td>
</tr>
<tr>
<td>
<p>\xXX</p>
</td>
<td>
<p>编号在 0 ~ 255 范围的字符，比如：<a href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cx20&amp;txt=It+is%2E">空格可以使用 &quot;\x20&quot; 表示</a></p>
</td>
</tr>
<tr>
<td>
<p>\uXXXX</p>
</td>
<td>
<p>任何字符可以使用 &quot;\u&quot; 再加上其编号的4位十六进制数表示，比如：<a href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cu4E2D&amp;txt=%D6%D0%B9%FA">&quot;\u4E2D&quot;</a></p>
</td>
</tr>
</tbody>
</table>
<p>3.2 在表达式 &quot;\s&quot;，&quot;\d&quot;，&quot;\w&quot;，&quot;\b&quot; 表示特殊意义的同时，对应的大写字母表示相反的意义</p>
<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
<tbody>
<tr bgcolor="#f0f0f0">
<td width="55">
<p>表达式</p>
</td>
<td>
<p>可匹配</p>
</td>
</tr>
<tr>
<td>
<p>\S</p>
</td>
<td>
<p><a href="http://www.regexlab.com/zh/workshop.asp?pat=%5CS%2B&amp;txt=abc+123+%40%23%24%25">匹配所有非空白字符（&quot;\s&quot; 可匹配各个空白字符）</a></p>
</td>
</tr>
<tr>
<td>
<p>\D</p>
</td>
<td>
<p><a href="http://www.regexlab.com/zh/workshop.asp?pat=%5CD%2B&amp;txt=abc+123+%40%23%24%25">匹配所有的非数字字符</a></p>
</td>
</tr>
<tr>
<td>
<p>\W</p>
</td>
<td>
<p><a href="http://www.regexlab.com/zh/workshop.asp?pat=%5CW%2B&amp;txt=abc+123+%40%23%24%25">匹配所有的字母、数字、下划线以外的字符</a></p>
</td>
</tr>
<tr>
<td>
<p>\B</p>
</td>
<td>
<p><a href="http://www.regexlab.com/zh/workshop.asp?pat=%5CB%2E%5CB&amp;txt=abc+123+%40%23%24%25">匹配非单词边界，即左右两边都是 &quot;\w&quot; 范围或者左右两边都不是 &quot;\w&quot; 范围时的字符缝隙</a></p>
</td>
</tr>
</tbody>
</table>
<p>3.3 在表达式中有特殊意义，需要添加 &quot;\&quot; 才能匹配该字符本身的字符汇总</p>
<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
<tbody>
<tr bgcolor="#f0f0f0">
<td width="55">
<p>字符</p>
</td>
<td>
<p>说明</p>
</td>
</tr>
<tr>
<td>
<p>^</p>
</td>
<td>
<p>匹配输入字符串的开始位置。要匹配 &quot;^&quot; 字符本身，请使用 &quot;\^&quot;</p>
</td>
</tr>
<tr>
<td>
<p>$</p>
</td>
<td>
<p>匹配输入字符串的结尾位置。要匹配 &quot;$&quot; 字符本身，请使用 &quot;\$&quot;</p>
</td>
</tr>
<tr>
<td>
<p>( )</p>
</td>
<td>
<p>标记一个子表达式的开始和结束位置。要匹配小括号，请使用 &quot;\(&quot; 和 &quot;\)&quot;</p>
</td>
</tr>
<tr>
<td>
<p>[ ]</p>
</td>
<td>
<p>用来自定义能够匹配 &#8216;多种字符&#8217; 的表达式。要匹配中括号，请使用 &quot;\[&quot; 和 &quot;\]&quot;</p>
</td>
</tr>
<tr>
<td>
<p>{ }</p>
</td>
<td>
<p>修饰匹配次数的符号。要匹配大括号，请使用 &quot;\{&quot; 和 &quot;\}&quot;</p>
</td>
</tr>
<tr>
<td>
<p>.</p>
</td>
<td>
<p>匹配除了换行符（\n）以外的任意一个字符。要匹配小数点本身，请使用 &quot;\.&quot;</p>
</td>
</tr>
<tr>
<td>
<p>?</p>
</td>
<td>
<p>修饰匹配次数为 0 次或 1 次。要匹配 &quot;?&quot; 字符本身，请使用 &quot;\?&quot;</p>
</td>
</tr>
<tr>
<td>
<p>+</p>
</td>
<td>
<p>修饰匹配次数为至少 1 次。要匹配 &quot;+&quot; 字符本身，请使用 &quot;\+&quot;</p>
</td>
</tr>
<tr>
<td>
<p>*</p>
</td>
<td>
<p>修饰匹配次数为 0 次或任意次。要匹配 &quot;*&quot; 字符本身，请使用 &quot;\*&quot;</p>
</td>
</tr>
<tr>
<td>
<p>|</p>
</td>
<td>
<p>左右两边表达式之间 &quot;或&quot; 关系。匹配 &quot;|&quot; 本身，请使用 &quot;\|&quot;</p>
</td>
</tr>
</tbody>
</table>
<p>3.4 括号 &quot;( )&quot; 内的子表达式，如果希望匹配结果不进行记录供以后使用，可以使用 &quot;(?:xxxxx)&quot; 格式</p>
<p>&nbsp;&nbsp;&nbsp; <a href="http://www.regexlab.com/zh/workshop.asp?pat=%28%3F%3A%28%5Cw%29%5C1%29%2B&amp;txt=a bbccdd efg">举例1：表达式 &quot;(?:(\w)\1)+&quot; 匹配 &quot;a bbccdd efg&quot; 时</a>，结果是 &quot;bbccdd&quot;。括号 &quot;(?:)&quot; 范围的匹配结果不进行记录，因此 &quot;(\w)&quot; 使用 &quot;\1&quot; 来引用。</p>
<p>3.5 常用的表达式属性设置简介：Ignorecase，Singleline，Multiline，Global</p>
<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
<tbody>
<tr bgcolor="#f0f0f0">
<td width="80">
<p>表达式属性</p>
</td>
<td>
<p>说明</p>
</td>
</tr>
<tr>
<td>
<p>Ignorecase</p>
</td>
<td>
<p>默认情况下，表达式中的字母是要区分大小写的。配置为 Ignorecase 可使匹配时不区分大小写。有的表达式引擎，把 &quot;大小写&quot; 概念延伸至 UNICODE 范围的大小写。</p>
</td>
</tr>
<tr>
<td>
<p>Singleline</p>
</td>
<td>
<p>默认情况下，小数点 &quot;.&quot; 匹配除了换行符（\n）以外的字符。配置为 Singleline 可使小数点可匹配包括换行符在内的所有字符。</p>
</td>
</tr>
<tr>
<td>
<p>Multiline</p>
</td>
<td>
<p>默认情况下，表达式 &quot;^&quot; 和 &quot;$&quot; 只匹配字符串的开始 ① 和结尾 ④ 位置。如：<br/><br/>①xxxxxxxxx②\n<br/>③xxxxxxxxx④<br/><br/>配置为 Multiline 可以使 &quot;^&quot; 匹配 ① 外，还可以匹配换行符之后，下一行开始前 ③ 的位置，使 &quot;$&quot; 匹配 ④ 外，还可以匹配换行符之前，一行结束 ② 的位置。</p>
</td>
</tr>
<tr>
<td>
<p>Global</p>
</td>
<td>
<p>主要在将表达式用来替换时起作用，配置为 Global 表示替换所有的匹配。</p>
</td>
</tr>
</tbody>
</table>
<hr color="#fea089" size="1"/>
<p><b><a name="prompt"></a>4. 综合提示</b></p>
<p>4.1 如果要要求表达式所匹配的内容是整个字符串，而不是从字符串中找一部分，那么可以在表达式的首尾使用 &quot;^&quot; 和 &quot;$&quot;，比如：&quot;^\d+$&quot; 要求整个字符串只有数字。</p>
<p>4.2 如果要求匹配的内容是一个完整的单词，而不会是单词的一部分，那么在表达式首尾使用 &quot;\b&quot;，比如：<a href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cb%28if%7Cwhile%7Celse%7Cvoid%7Cint%29%5Cb&amp;txt=if%28ifdo%29%0D%0A++++dosome%28%29%3B%0D%0Aelse%0D%0A++++doelse%28%29%3B">使用 &quot;\b(if|while|else|void|int&hellip;&hellip;)\b&quot; 来匹配程序中的关键字</a>。</p>
<p>4.3 表达式不要匹配空字符串。否则会一直得到匹配成功，而结果什么都没有匹配到。比如：准备写一个匹配 &quot;123&quot;、&quot;123.&quot;、&quot;123.5&quot;、&quot;.5&quot; 这几种形式的表达式时，整数、小数点、小数数字都可以省略，但是不要将表达式写成：&quot;\d*\.?\d*&quot;，因为如果什么都没有，这个表达式也可以匹配成功。<a href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cd%2B%5C%2E%3F%5Cd%2A%7C%5C%2E%5Cd%2B&amp;txt=123%2C+123%2E%2C+123%2E5%2C+%2E5%2C+%2E">更好的写法是：&quot;\d+\.?\d*|\.\d+&quot;</a>。</p>
<p>4.4 能匹配空字符串的子匹配不要循环无限次。如果括号内的子表达式中的每一部分都可以匹配 0 次，而这个括号整体又可以匹配无限次，那么情况可能比上一条所说的更严重，匹配过程中可能死循环。虽然现在有些正则表达式引擎已经通过办法避免了这种情况出现死循环了，比如 .NET 的正则表达式，但是我们仍然应该尽量避免出现这种情况。如果我们在写表达式时遇到了死循环，也可以从这一点入手，查找一下是否是本条所说的原因。</p>
<p>4.5 合理选择贪婪模式与非贪婪模式，参见<a href="http://www.regexlab.com/zh/regtopic.htm#reluctant">话题讨论</a>。</p>
<p>4.6 或 &quot;|&quot; 的左右两边，对某个字符最好只有一边可以匹配，这样，不会因为 &quot;|&quot; 两边的表达式因为交换位置而有所不同。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/guanvee/archive/2006/05/24/882865.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>精彩小笑话博你一笑</title>
		<link>http://blog.donews.com/guanvee/archive/2006/05/24/882837.aspx</link>
		<comments>http://blog.donews.com/guanvee/archive/2006/05/24/882837.aspx#comments</comments>
		<pubDate>Wed, 24 May 2006 02:27:00 +0000</pubDate>
		<dc:creator>guanvee</dc:creator>
				<category><![CDATA[10--搞笑收藏]]></category>

		<guid isPermaLink="false">http://blog.donews.com/guanvee/archive/2006/05/24/882837.aspx</guid>
		<description><![CDATA[<p><font color="#333333">新华网河北频道 ( 2006-05-22 10:36:48 ) </font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;<font color="#333333">稿件来源： 发展论坛 </font></p><p>&#160;&#160;&#160;&#160;1.一个男的帮他太太向保险公司买了保险。签约完后，男的问那个业务员：&#8220;如果我太太今天晚上死了，我可以得多少？&#8221;业务员答道：&#8220;大概二十年徒刑吧！&#8221; </p><p>&#160;&#160;&#160;&#160;2.一对情侣吵架。女：&#8220;你每一样东西都比不上任何人！&#8221;男：&#8220;对，尤其是女朋友！&#8221; </p><p>&#160;&#160;&#160;&#160;3.女：你喜欢我天使的脸孔，还是魔鬼的身材？男：我&#8230;&#8230;<!--ADV_CONTENT-->我喜欢你的幽默感。  </p><p>&#160;&#160;&#160;&#038;nb]]></description>
			<content:encoded><![CDATA[<p><font color="#333333">新华网河北频道 ( 2006-05-22 10:36:48 ) </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#333333">稿件来源： 发展论坛 </font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;1.一个男的帮他太太向保险公司买了保险。签约完后，男的问那个业务员：&ldquo;如果我太太今天晚上死了，我可以得多少？&rdquo;业务员答道：&ldquo;大概二十年徒刑吧！&rdquo; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;2.一对情侣吵架。女：&ldquo;你每一样东西都比不上任何人！&rdquo;男：&ldquo;对，尤其是女朋友！&rdquo; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;3.女：你喜欢我天使的脸孔，还是魔鬼的身材？男：我&hellip;&hellip;<!--ADV_CONTENT-->我喜欢你的幽默感。  </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;4.小明：&ldquo;妹妹，你干嘛那么用功？&rdquo;妹妹：&ldquo;还不都是因为你。&rdquo;小明：&ldquo;我？&rdquo;妹妹：&ldquo;没错，我们家总要有人有出息吧！&rdquo; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;5.餐厅中。&ldquo;服务生，你们这有什么招牌菜？&rdquo;&ldquo;先生，我们这儿最有名的是燕窝。&rdquo;&ldquo;不了，我不吃动物吐出来的东西，太没卫生了。&rdquo;&ldquo;那您想吃什么？&rdquo;&ldquo;先来一份鸡蛋吧。&rdquo; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;6.男职员向女主管请假。男职员：&ldquo;经理，我想请假去向我女友求婚。&rdquo;女主管：&ldquo;(鄙视)难道你没有听过婚姻是爱情的坟墓？&rdquo;男职员想了一想。男职员：&ldquo;那么我请丧假。&rdquo; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;7.小学五年级女孩的超强作文 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;题目 &#8211; - &#8211; &ldquo;三十年后的我&rdquo; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;班上的一位女生小美写道：&ldquo;&#8230;&#8230;今天的天气不错，我带著我的小孩到大安森林公园去玩，我们开著老公买给我的劳司莱斯，手指上有著他刚买给我的大钻戒，脖子上也挂著上月才送我的金链子。我带著我可爱的小孩走在公园里，到处都是人们羡慕的眼光。突然，路上冲出一个浑身恶臭、满脸污泥、无家可归的老太太，我仔细一瞧～～～天啊！她竟然是我小学五年级的语文老师！&#8230;&#8230;&rdquo; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;8.失恋的男人与上帝 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;一个男人自杀后去见上帝。上帝问：&ldquo;我的孩子，你为什么要自杀啊？&rdquo;男人说：&ldquo;我追求一个女子，但是她说我没有高大英俊的身材和相貌，所以我被拒绝了。&rdquo;上帝若有所思的点点头说：&ldquo;这到是，在爱情里面视觉效果是很重要的。这样吧，我给你一副举世无双的漂亮外壳，你现在回去追求你的幸福吧。&rdquo; 说着上帝念起了咒语，只听&ldquo;嗖&rdquo;的一声，男人走了。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;一个星期后男人第二次自杀回来，又见到了上帝。上帝问：&ldquo;我的孩子，你为什么又要自杀啊？&rdquo;男人痛苦的说：&ldquo;我回去以后，那个女子说，虽然我长的很帅，但是我一点都不了解她。我又被拒绝了。&rdquo;上帝理解的点点头：&ldquo;这是当然，如果不了解一个人，有怎么知道如何才能给她幸福呢？这样吧，我给你超人的洞察力和直觉，你回去追求你的幸福吧。&rdquo;说着上帝念起了咒语，只听&ldquo;嗖&rdquo;的一声，男人又走了。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;一个星期后男人又回来了，那是第三次自杀。上帝很惊讶的问：&ldquo;我的孩子，你为什么又自杀了啊？&rdquo;男人极端痛苦的说：我回去以后，虽然长的很帅，而且很了解她，但她说她早已经把自己的身体献给了另一个男人了。&rdquo;上帝同情的看了看这个不幸的男人，最后说道：&ldquo;这样吧，既然你这么喜欢那个女子，我就让那个男人死掉，这样那个女子就是你的了，你回去吧！&rdquo;上帝念起了了咒语，咒语刚念到一半，只听&ldquo;咣当！&rdquo;一声，上帝倒在地上，硬邦邦的死了。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;男人高兴的说：&ldquo;这下我终于可以回去追求那个漂亮的修女了！&rdquo; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;9.佐罗之死 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;一日，佐罗到情妇家与情妇幽会。情妇问佐罗：&ldquo;要是我丈夫回来了，怎么办？ &rdquo; 佐罗说：&ldquo;没事儿，你丈夫要是回来了，我就从窗户跳下去，我的马会在下面接我的。&rdquo; 情妇说：要是听到三声敲门，就是我丈夫回来了。 佐罗说：我知道了。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;过了一会儿，天下雨了。突然传来&ldquo;咚、咚、咚&rdquo;三声敲门声。说时迟，那时快，佐罗从床上飞身跃下，一转眼，已经从窗户跳出。情妇见佐罗已走，便去开门。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;只见门前站着一匹马，对她说：&ldquo;你告诉佐罗一声，外面下雨了，我在楼道里等他。&rdquo; </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/guanvee/archive/2006/05/24/882837.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Atlas UpdatePanel简要介绍</title>
		<link>http://blog.donews.com/guanvee/archive/2006/05/18/874641.aspx</link>
		<comments>http://blog.donews.com/guanvee/archive/2006/05/18/874641.aspx#comments</comments>
		<pubDate>Thu, 18 May 2006 05:50:00 +0000</pubDate>
		<dc:creator>guanvee</dc:creator>
				<category><![CDATA[atlas&ajax]]></category>

		<guid isPermaLink="false">http://blog.donews.com/guanvee/archive/2006/05/18/874641.aspx</guid>
		<description><![CDATA[<span>英文版见：</span><span><a href="http://dflying.dflying.net/1/archive/96_introduction_to_atlas_updatepanel.html">http://dflying.dflying.net/1/archive/96_introduction_to_atlas_updatepanel.html</a> </span><p><span>UpdatePanel</span><span>是</span><span>ASP.NET Atlas</span><span>中很重要的一个控件。它把传统的</span><span>ASP.NET</span><span>程序与最新的</span><span>Web 2.0 AJAX</span><span>无缝的连接在一起。如果你已经有一些基于</span><span>ASP.NET</span><span>的网站，</span><span>UpdatePanel</span><span>可以让你通过很小的修改轻松的实现</span><span>AJAX</span]]></description>
			<content:encoded><![CDATA[<p><span>英文版见：</span><span><a href="http://dflying.dflying.net/1/archive/96_introduction_to_atlas_updatepanel.html">http://dflying.dflying.net/1/archive/96_introduction_to_atlas_updatepanel.html</a> </span>
<p><span>UpdatePanel</span><span>是</span><span>ASP.NET Atlas</span><span>中很重要的一个控件。它把传统的</span><span>ASP.NET</span><span>程序与最新的</span><span>Web 2.0 AJAX</span><span>无缝的连接在一起。如果你已经有一些基于</span><span>ASP.NET</span><span>的网站，</span><span>UpdatePanel</span><span>可以让你通过很小的修改轻松的实现</span><span>AJAX</span><span>。如果你并不很熟悉</span><span>AJAX</span><span>相关的技术比如</span><span>JavaScript/DOM</span><span>等，</span><span>UpdatePanel</span><span>更是可以让你不用书写一行客户端脚本而实现酷酷的</span><span>AJAX</span><span>应用。所需要的就是把需要动态更新的部分放置于一个</span><span>UpdatePanel</span><span>中，这一点与</span><span>MagicAjax Framework</span><span>有着异曲同工之妙。</span></p>
<p><span>使用</span><span>UpdatePanel</span><span>很简单，只需要如下几个步骤：</span></p>
<ol>
<li><span>用</span><span>ASP.NET</span><span>实现你的设计，此刻你并不需要考虑任何有关</span><span>AJAX</span><span>的问题，就像普通的</span><span>ASP.NET</span><span>程序一样。</span> </li>
<li><span>在页面上添加一个</span><span>ScriptManager</span><span>对象，并设定属性</span><span>EnablePartialUpdates=true</span> </li>
<li><span>将你希望动态更新的部分用</span><span>UpdatePanel</span><span>包围起来</span> </li>
<li><span>为你添加的</span><span>UpdatePanel</span><span>设定</span><span>Event Trigger</span> </li>
</ol>
<p>&nbsp;</p>
<p><span></span></p>
<p><span>只要这些步骤就够了，不需要考虑</span><span>XMLHTTPRequest</span><span>或者</span><span>ActiveX</span><span>对象，也不需要书写客户端的脚本或者考虑如何与服务器通信，所有的细节，</span><span>Atlas</span><span>已经为你做好了。</span>
<p><span>Atlas UpdatePanel</span><span>的实现也很简单：浏览器如同普通</span><span>PostBack</span><span>一样</span><span>Post</span><span>回服务器，服务器处理后再次发送给浏览器，这个过程就和传统的页面模型一样。但到达客户端时</span><span>ScriptManager</span><span>只更新位于</span><span>UpdatePanel</span><span>中的内容和</span><span>ViewState</span><span>。</span></p>
<p><span>使用</span><span>UpdatePanel</span><span>中应该注意的几个问题：</span></p>
<p><span>必须指定</span><span>ScriptManager </span><span>中的属性</span><span>EnablePartialUpdates=true</span><span>，这样</span><span>ScriptManager</span><span>才会将普通的</span><span>PostBack</span><span>转化为对服务器的异步调用，也就是</span><span>AJAX</span><span>的方法。否则页面只会与传统的</span><span>ASP.NET</span><span>一样刷新。</span></p>
<p><span>其次，</span><span>UpdatePanel</span><span>提供两种引发异步</span><span>PostBack</span><span>的</span><span>Trigger</span><span>：</span></p>
<ul>
<li><b><span>ControlValueTrigger</span></b><b><span>：</span></b><span>当某个控件的某个指定的属性变化时更新。例如：</span><span>ControlID=&quot;dropDownList1&quot; PropertyName=&quot;SelectedValue&quot;</span> </li>
<li><b><span>ControlEventTrigger</span></b><b><span>：</span></b><span>当某个控件发出指定事件时更新。例如：</span><span>ControlID=&quot;button1&quot; EventName=&quot;Click&quot;</span> </li>
</ul>
<p><span>最后，每个</span><span>UpdatePanel</span><span>都有两种更新的方式：</span></p>
<ul>
<li><b><span>Always</span></b><b><span>：</span></b><span>每次</span><span>AJAX PostBack</span><span>或是普通</span><span>PostBack</span><span>的时候都会更新该</span><span>Panel</span><span>的内容</span> </li>
<li><b><span>Conditional</span></b><b><span>：</span></b><span>只有满足如下某一条件时才更新该</span><span>Panel</span><span>的内容：</span>
<ol>
<li><span>当</span><span>Panel</span><span>中的某个控件引发了</span><span>PostBack</span><span>时</span> </li>
<li><span>当</span><span>Panel</span><span>所指定的某个</span><span>Trigger</span><span>被引发时</span> </li>
<li><span>当</span><span>Panel</span><span>的</span><span>Update()</span><span>方法在</span><span>Codebehind</span><span>中被调用时</span> </li>
</ol>
</li>
</ul>
<p>&nbsp;</p>
<p><span></span></p>
<p><span>一小段</span><span>UpdatePanel</span><span>的例子
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://dflying.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""/><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">atlas:ScriptManager&nbsp;</span><span style="COLOR: #ff0000">ID</span><span style="COLOR: #0000ff">=&quot;ScriptManager1&quot;</span><span style="COLOR: #ff0000">&nbsp;EnablePartialRendering</span><span style="COLOR: #0000ff">=&quot;true&quot;</span><span style="COLOR: #ff0000">&nbsp;runat</span><span style="COLOR: #0000ff">=&quot;server&quot;</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br/></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img src="http://dflying.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""/></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">atlas:UpdatePanel&nbsp;</span><span style="COLOR: #ff0000">ID</span><span style="COLOR: #0000ff">=&quot;up1&quot;</span><span style="COLOR: #ff0000">&nbsp;runat</span><span style="COLOR: #0000ff">=&quot;server&quot;</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br/></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://dflying.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""/>&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">Triggers</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br/></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://dflying.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">atlas:ControlValueTrigger&nbsp;</span><span style="COLOR: #ff0000">ControlID</span><span style="COLOR: #0000ff">=&quot;dropDownList1&quot;</span><span style="COLOR: #ff0000">&nbsp;PropertyName</span><span style="COLOR: #0000ff">=&quot;SelectedValue&quot;</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br/></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://dflying.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">atlas:ControlEventTrigger&nbsp;</span><span style="COLOR: #ff0000">ControlID</span><span style="COLOR: #0000ff">=&quot;button1&quot;</span><span style="COLOR: #ff0000">&nbsp;EventName</span><span style="COLOR: #0000ff">=&quot;Click&quot;</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br/></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://dflying.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""/>&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">Triggers</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br/></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://dflying.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""/>&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ContentTemplate</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br/></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://dflying.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Content&nbsp;Here.&nbsp;e.g.&nbsp;TextBox,&nbsp;GridView<br/></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://dflying.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""/>&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">ContentTemplate</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br/></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://dflying.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""/></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">atlas:UpdatePanel</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br/></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://dflying.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt=""/></span></div>
<p>&nbsp;</p>
<p></span><span>另外还有两个有用的</span><span>Atlas</span><span>特性：</span><span>UpdateProgress</span><span>控件可以在更新的等待时间自动显示一段提示信息，可以是一段&ldquo;更新中&hellip;&hellip;&rdquo;文字也可以是</span><span>GIF</span><span>图像或者是更复杂的定制的内容。还有</span><span>Atlas</span><span>提供的错误处理机制，以便集中处理更新中可能发生的错误。目前有很多</span><span>AJAX</span><span>程序的错误处理机制设计的并不是很好，包括</span><span>Windows Live Mail</span><span>。</span>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/guanvee/archive/2006/05/18/874641.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MSN 80072efd错误的解决办法</title>
		<link>http://blog.donews.com/guanvee/archive/2006/05/14/869478.aspx</link>
		<comments>http://blog.donews.com/guanvee/archive/2006/05/14/869478.aspx#comments</comments>
		<pubDate>Sun, 14 May 2006 11:36:00 +0000</pubDate>
		<dc:creator>guanvee</dc:creator>
				<category><![CDATA[12--知识收藏]]></category>

		<guid isPermaLink="false">http://blog.donews.com/guanvee/archive/2006/05/14/869478.aspx</guid>
		<description><![CDATA[<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 30pt"><span style="FONT-SIZE: 15pt; COLOR: black; FONT-FAMILY: 仿宋_GB2312; mso-hansi-font-family: 宋体">现在，越来越多的朋友们开始使用<span lang="EN-US">MSN</span>，但在使用<span lang="EN-US">MSN</span>的过程往往遇到一些问题，最常见的就是<span lang="EN-US">80072efd</span>错误，也就是在登录<span lang="EN-US">MSN</span>时，会弹出&#8220;抱歉，你现在无法登陆，稍后再试。<span lang="EN-US">80072efd</span>&#8221;这样的提示。<span lang="EN-US"><p></p></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; T]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 30pt"><span style="FONT-SIZE: 15pt; COLOR: black; FONT-FAMILY: 仿宋_GB2312; mso-hansi-font-family: 宋体">现在，越来越多的朋友们开始使用<span lang="EN-US">MSN</span>，但在使用<span lang="EN-US">MSN</span>的过程往往遇到一些问题，最常见的就是<span lang="EN-US">80072efd</span>错误，也就是在登录<span lang="EN-US">MSN</span>时，会弹出&ldquo;抱歉，你现在无法登陆，稍后再试。<span lang="EN-US">80072efd</span>&rdquo;这样的提示。<span lang="EN-US">
</p>
<p></span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 30pt"><span style="FONT-SIZE: 15pt; FONT-FAMILY: 仿宋_GB2312; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN">总体看，出现</span><span lang="EN-US" style="FONT-SIZE: 15pt; COLOR: black; FONT-FAMILY: 仿宋_GB2312; mso-hansi-font-family: 宋体">80072efd</span><span style="FONT-SIZE: 15pt; COLOR: black; FONT-FAMILY: 仿宋_GB2312; mso-hansi-font-family: 宋体">错误的根本原因是某种网络问题引起<span lang="EN-US">MSN</span>无法正常登录，主要起因是代理服务器、防火墙、路由器的设置以及浏览器<span lang="EN-US">SSL</span>功能损坏等，掌握引起这个问题的起因，解决起来就方便多了。<span lang="EN-US">
</p>
<p></span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 30pt"><span style="FONT-SIZE: 15pt; COLOR: black; FONT-FAMILY: 仿宋_GB2312; mso-hansi-font-family: 宋体">要解决这个问题，需要从以下几个方面着手：<span lang="EN-US">
</p>
<p></span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 30pt"><span style="FONT-SIZE: 15pt; FONT-FAMILY: 仿宋_GB2312">首先，点击<span lang="EN-US">MSN</span>的工具栏菜单，打开选项－连接，查看连接里是否设置了代理服务器，如果有，就取消它，然后再尝试重新登录。另外，如果通过路由器上网，还应查看路由器的设置，并重新启动路由器。<span lang="EN-US">
</p>
<p></span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 30pt"><span style="FONT-SIZE: 15pt; FONT-FAMILY: 仿宋_GB2312">接下来，关掉所有的第三方防火墙，防火墙很有可能是阻止<span lang="EN-US">MSN</span>登录的原因。然后，确保你的电脑里没有安装任何广告软件（</span><span style="FONT-SIZE: 15pt; FONT-FAMILY: 仿宋_GB2312; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN">adware</span><span lang="EN-US" style="FONT-SIZE: 15pt; FONT-FAMILY: 仿宋_GB2312">)</span><span style="FONT-SIZE: 15pt; FONT-FAMILY: 仿宋_GB2312">或间谍软件（<span lang="EN-US" style="COLOR: black">spyware)</span>，如果有，一定要移除它们。对付这些广告软件和间谍软件，推荐采用微软的<span lang="EN-US">Microsoft AntiSpyware</span>，这是一款非常实用的反间谍软件，你可以在下面的网址免费得到它：<span lang="EN-US"><a href="http://www.microsoft.com/downloads">http://www.microsoft.com/downloads</a></span>。<span lang="EN-US">
</p>
<p></span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 30pt"><span style="FONT-SIZE: 15pt; FONT-FAMILY: 仿宋_GB2312">做完上面的这些事情，就可以再次尝试登录<span lang="EN-US">MSN</span>了，如果问题仍然没有解决，那么就在浏览器里输入<span lang="EN-US"><a href="https://www.amazon.com/">https://www.amazon.com</a></span>，看是否能正常打开<span lang="EN-US">amazon</span>的网站，如果不能，就说明浏览器内建的</span><span style="FONT-SIZE: 15pt; FONT-FAMILY: 仿宋_GB2312; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN">SSL支持功能已经损坏了，可以在windows的&ldquo;开始－运行&rdquo;栏内键入regsvr32 softpub.dll，然后点击OK，接下来，再重复以上动作，依次键入：
</p>
<p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 30pt"><span style="FONT-SIZE: 15pt; FONT-FAMILY: 仿宋_GB2312; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN">regsvr32 wintrust.dll
</p>
<p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 30pt"><span style="FONT-SIZE: 15pt; FONT-FAMILY: 仿宋_GB2312; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN">regsvr32 initpki.dll
</p>
<p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 30pt"><span style="FONT-SIZE: 15pt; FONT-FAMILY: 仿宋_GB2312; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN">regsvr32 dssenh.dll
</p>
<p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 30pt"><span style="FONT-SIZE: 15pt; FONT-FAMILY: 仿宋_GB2312; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN">regsvr32 rsaenh.dll
</p>
<p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 30pt"><span style="FONT-SIZE: 15pt; FONT-FAMILY: 仿宋_GB2312; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN">regsvr32 gpkcsp.dll
</p>
<p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 30pt"><span style="FONT-SIZE: 15pt; FONT-FAMILY: 仿宋_GB2312; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN">regsvr32 sccbase.dll
</p>
<p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 30pt"><span style="FONT-SIZE: 15pt; FONT-FAMILY: 仿宋_GB2312; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN">regsvr32 slbcsp.dll
</p>
<p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 30pt"><span style="FONT-SIZE: 15pt; FONT-FAMILY: 仿宋_GB2312; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN">regsvr32 cryptdlg.dll
</p>
<p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 30pt"><span style="FONT-SIZE: 15pt; FONT-FAMILY: 仿宋_GB2312; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN">这样做以后，就可以再次尝试登录MSN了。如果还是不能登录，那么，在&ldquo;开始－运行&rdquo;栏内一次全部键入regsvr32 softpub.dll wintrust.dll initpki.dll dssenh.dll rsaenh.dll gpkcsp.dll sccbase.dll slbcsp.dll cryptdlg.dll（注意，这是一整行命令）、再点击OK，接下来，打开MSN登录吧。
</p>
<p></span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/guanvee/archive/2006/05/14/869478.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>企盼已久,gmail中文版更新了!</title>
		<link>http://blog.donews.com/guanvee/archive/2006/05/11/864321.aspx</link>
		<comments>http://blog.donews.com/guanvee/archive/2006/05/11/864321.aspx#comments</comments>
		<pubDate>Thu, 11 May 2006 02:36:00 +0000</pubDate>
		<dc:creator>guanvee</dc:creator>
				<category><![CDATA[13--其它收藏]]></category>

		<guid isPermaLink="false">http://blog.donews.com/guanvee/archive/2006/05/11/864321.aspx</guid>
		<description><![CDATA[<div class="content"><div align="left"><a name="about"></a>早就听说gtalk集成到gmail中了,不过中文版迟迟不肯更新,终于在今天上线了,看看都多了哪些功能....</div><div align="left"><font color="#444444"><b></b></font></div><div align="left"><font color="#444444"><b>Gmail 有哪些新增功能？</b></font></div><div style="BORDER-TOP: #c3d9ff 2px solid"></div><font size="-1"><p><b>Gmail 学会了聊天。</b><br/>现在 Gmail 帐户已自动启用了聊天功能。您不必执行任何特殊步骤即可开始聊天。查看您的好友何时在线并想好怎样和他们联系。电子邮件和即时消息不一定非要不同。<a href="http://mail.google.com/mail/help/intl/zh-CN/chat.html">了解详情</a></p><]]></description>
			<content:encoded><![CDATA[<div class="content">
<div align="left"><a name="about"></a>早就听说gtalk集成到gmail中了,不过中文版迟迟不肯更新,终于在今天上线了,看看都多了哪些功能&#8230;.</div>
<div align="left"><font color="#444444"><b></b></font></div>
<div align="left"><font color="#444444"><b>Gmail 有哪些新增功能？</b></font></div>
<div style="BORDER-TOP: #c3d9ff 2px solid"></div>
<p><font size="-1">
<p><b>Gmail 学会了聊天。</b><br/>现在 Gmail 帐户已自动启用了聊天功能。您不必执行任何特殊步骤即可开始聊天。查看您的好友何时在线并想好怎样和他们联系。电子邮件和即时消息不一定非要不同。<a href="http://mail.google.com/mail/help/intl/zh-CN/chat.html">了解详情</a></p>
<p><strong>病毒扫描在此！</strong><br/>每次打开或发送包含附件的邮件时，系统会自动对其进行检查。我们会尽力删除发现的病毒，保护您不受这些病毒的侵害。但日常的小病小痒感冒之类，您就得自己费心了（不妨试试鸡汤）。<a href="http://mail.google.com/support/bin/answer.py?answer=25760&amp;hl=zh_CN">了解详情</a> </p>
<p><strong>假期自动应答</strong><br/>如果您正在享受海滩的悠闲或乘坐火车横穿西伯利亚，请设置自动应答，这样您的朋友可以知道您无法查收邮件。<a href="http://mail.google.com/support/bin/answer.py?answer=25922&amp;hl=zh_CN">了解详情</a> </p>
<p><strong>联系人群组</strong><br/>广大用户最常请求的一项功能终于实现了！现在，您可以向一组成员发送邮件而不必再逐一挑选个别邮件地址。<a href="http://mail.google.com/support/bin/answer.py?answer=30970&amp;hl=zh_CN">了解详情</a> </p>
<p><strong>在 HTML 格式下查看</strong><br/>现在，只需单击&ldquo;在 HTML 格式下查看&rdquo;链接，就可以查看 Microsoft Office、OpenOffice 或 .pdf 格式的附件，不必下载。如果您在使用手机时想先睹为快，或者不想为仅仅查看一篇文档而安装软件，这一功能恰好适用！<a href="http://mail.google.com/support/bin/answer.py?answer=30719&amp;hl=zh_CN">了解详情</a> </p>
<p><b>自动保存</b><br/>我花了 20 分钟写这封邮件，不料浏览器却崩溃了。<br/>有了自动保存，万事大吉。它会自动为您存档。</p>
<p><b>彰显个性</b><br/>@gmail.com、@yourschool.edu 或 @yourcustomdomain.com，随您选用。现在，您可以自定义外发邮件上的&ldquo;发件人：&rdquo;地址以显示您的另一个地址，而不显示 Gmail 地址。您可以使用您所拥有的任意别名或电子邮件地址，但仍需通过 Gmail 发送。<a href="http://mail.google.com/support/bin/answer.py?answer=20616&amp;hl=zh_CN">了解详情</a></p>
<p><b>带着朋友走四方</b><br/>现在您可以把存在Gmail中的通讯录汇出了，既可以把汇出的文件汇入其他电子邮件信箱，也可以汇入其他服务，如果您正在使用Gmail的免费POP功能，这将是很棒的功能添加。或者，只是把它作为备份，这样您就再也不会失去和朋友的联系了。</p>
<p><b>英语版只是其中一种语言&#8230;</b><br/>您可以选择 Gmail 的各种语言版本！界面现在已提供 37 种语言：Bahasa Indonesia、Catal&agrave;、Dansk、Deutsch、Eesti keel、English (UK)、Espa&ntilde;ol、Fran&ccedil;ais、Hrvatski、Italiano、&Iacute;slenska、Latvie&scaron;u、Lietuvių、Magyar、Nederlands、Polski、Portugu&ecirc;s、Rom&acirc;nă、Slovensk&yacute;、Sloven&scaron;čina、Suomi、Svenska、Tagalog、Tiếng Việt、T&uuml;rk&ccedil;e、Česky、&Epsilon;&lambda;&lambda;&eta;&nu;&iota;&kappa;ά、Русский、Српски、Українська、Български、हिन्दी、ภาษาไทย、中文 (简体)、中文 (繁體)、日本語、和 한국어。此外还有英国英语。您可以自行选择。 <a href="http://gmail.google.com/support/bin/answer.py?answer=17091&amp;hl=zh_CN">了解更多信息</a></p>
<p></font></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/guanvee/archive/2006/05/11/864321.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>超级搞笑:一定要学好普通话</title>
		<link>http://blog.donews.com/guanvee/archive/2006/05/10/862707.aspx</link>
		<comments>http://blog.donews.com/guanvee/archive/2006/05/10/862707.aspx#comments</comments>
		<pubDate>Wed, 10 May 2006 08:28:00 +0000</pubDate>
		<dc:creator>guanvee</dc:creator>
				<category><![CDATA[10--搞笑收藏]]></category>

		<guid isPermaLink="false">http://blog.donews.com/guanvee/archive/2006/05/10/862707.aspx</guid>
		<description><![CDATA[<div>一个骑兵在作战中不幸被俘。 </div><div>　　&#8220;我们会杀掉所以俘虏，&#8221;敌军首领对他说：&#8220;不过由于你在作战中表现英勇，令人佩服，我可以三天后再杀，在此之前满足你三个要求。现在，你可以提第一个要求了。&#8221; </div><div>　　骑兵想也没想，说：&#8220;我想对我的马说句话。&#8221; 首领答应了。 </div><div>　　于是骑兵走过去，对他的马耳语了一句。那马听了后，长啸一 声，疾驰而去。 </div><div>　　黄昏时分，马回来了，背上驮着一个漂亮女郎。当天晚上，骑兵便与女郎共度良宵。 </div><div>　　首领啧啧称奇：&#8220;真是一匹神奇的宝马！他说：&#8220;不过，我还是要杀你。你的第二个要求是什么？&#8221;骑兵再次要求和马说句话。 </div><div>　　首领答应了，于是骑兵再次跟马耳语了一句，那马又长啸一声，疾驰而去。 </div><div>　　黄昏时分，马又回来了，这次背上驮的有是个女郎，比上次那个更加性感动人。当天晚上，骑兵与这位女郎又度过了欢乐的一晚。 </div><]]></description>
			<content:encoded><![CDATA[<div>一个骑兵在作战中不幸被俘。 </div>
<div>　　&ldquo;我们会杀掉所以俘虏，&rdquo;敌军首领对他说：&ldquo;不过由于你在作战中表现英勇，令人佩服，我可以三天后再杀，在此之前满足你三个要求。现在，你可以提第一个要求了。&rdquo; </div>
<div>　　骑兵想也没想，说：&ldquo;我想对我的马说句话。&rdquo; 首领答应了。 </div>
<div>　　于是骑兵走过去，对他的马耳语了一句。那马听了后，长啸一 声，疾驰而去。 </div>
<div>　　黄昏时分，马回来了，背上驮着一个漂亮女郎。当天晚上，骑兵便与女郎共度良宵。 </div>
<div>　　首领啧啧称奇：&ldquo;真是一匹神奇的宝马！他说：&ldquo;不过，我还是要杀你。你的第二个要求是什么？&rdquo;骑兵再次要求和马说句话。 </div>
<div>　　首领答应了，于是骑兵再次跟马耳语了一句，那马又长啸一声，疾驰而去。 </div>
<div>　　黄昏时分，马又回来了，这次背上驮的有是个女郎，比上次那个更加性感动人。当天晚上，骑兵与这位女郎又度过了欢乐的一晚。 </div>
<div>　　首领大为叹服：&ldquo;你和你的马都令人大开眼界，不过明天我还是要杀你，现在你提出你最后一个要求吧。&rdquo; </div>
<div>　　骑兵想了一下，说：&ldquo;我想和我的马单独谈谈。&rdquo; </div>
<div>　　首领觉得很奇怪，不过还是点头应允，带着随从离开了，帐篷里只剩下骑兵和他的宝马。 </div>
<div>　　骑兵死死地盯着他的马，突然揪住它的双耳，气冲冲的说：&ldquo;我再说一遍，带一个旅的人来，不是带一个女人来！！&rdquo;</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/guanvee/archive/2006/05/10/862707.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一道c#的使用event &#8212; delegate设计例子</title>
		<link>http://blog.donews.com/guanvee/archive/2006/04/25/845503.aspx</link>
		<comments>http://blog.donews.com/guanvee/archive/2006/04/25/845503.aspx#comments</comments>
		<pubDate>Tue, 25 Apr 2006 06:38:00 +0000</pubDate>
		<dc:creator>guanvee</dc:creator>
				<category><![CDATA[01--ASP.NET/ASP收藏]]></category>

		<guid isPermaLink="false">http://blog.donews.com/guanvee/archive/2006/04/25/845503.aspx</guid>
		<description><![CDATA[<p>目标: 猫大叫一声，所有的老鼠都开始逃跑，主人被惊醒。(C#语言)</p>
<p>要求：&#160; 1.要有联动性，老鼠和主人的行为是被动的。</p>
<p>2.考虑可扩展性，猫的叫声可能引起其他联动效应。</p><br/><p><br type="_moz"/></p><p>
</p><p>public delegate void SubEventHandler();<br/>&#160;&#160;&#160; public abstract class 
Subject<br/>&#160;&#160;&#160; {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; public event SubEventHandler SubEvent;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
protected void FireAway()<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; {<br/>&#160;&#160;]]></description>
			<content:encoded><![CDATA[<p>目标: 猫大叫一声，所有的老鼠都开始逃跑，主人被惊醒。(C#语言)</p>
<p>要求：&nbsp; 1.要有联动性，老鼠和主人的行为是被动的。</p>
<p>2.考虑可扩展性，猫的叫声可能引起其他联动效应。</p>
<p><br/>
<p><br type="_moz"/></p>
</p>
<p>public delegate void SubEventHandler();<br/>&nbsp;&nbsp;&nbsp; public abstract class<br />
Subject<br/>&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public event SubEventHandler SubEvent;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
protected void FireAway()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (this.SubEvent !=<br />
null)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.SubEvent();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp; public<br />
class Cat : Subject<br/>&nbsp;&nbsp;&nbsp; {&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void Cry()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&quot;cat cryed.&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
this.FireAway();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp; public abstract class<br />
Observer<br/>&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Observer(Subject sub)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sub.SubEvent += new SubEventHandler(Response);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public abstract void Response();&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp; public class<br />
Mouse : Observer<br/>&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private string name;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public<br />
Mouse(string name, Subject sub) : base(sub)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
this.name = name;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public override void<br />
Response()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(name + &quot; attempt to<br />
escape!&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp; public class Master : Observer<br/>&nbsp;&nbsp;&nbsp;<br />
{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Master(Subject sub) : base(sub){}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public override<br />
void Response()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&quot;host<br />
waken&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp; class Class1<br/>&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static<br />
void Main(string[] args)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cat cat = new<br />
Cat();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Mouse mouse1 = new Mouse(&quot;mouse1&quot;, cat);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
Mouse mouse2 = new Mouse(&quot;mouse2&quot;, cat);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Master master = new<br />
Master(cat);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cat.Cry();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/guanvee/archive/2006/04/25/845503.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

