<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_一修先生'blog</title><subtitle type="text">面朝大海，春暖花开.NET 之路......</subtitle><id>http://feed.cnblogs.com/blog/u/51751/rss</id><updated>2012-02-21T08:50:59Z</updated><author><name>一修先生</name><uri>http://www.cnblogs.com/1971ruru/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/1971ruru/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/51751/rss"/><entry><id>http://www.cnblogs.com/1971ruru/archive/2012/02/21/2361583.html</id><title type="text">三种SQLite数据库管理工具(IDE)的介绍及区别</title><summary type="text">SqLite 本是一个团队开发的小型数据库..因为小可以存为本地.并且可以离线访问,所以现在的FlashAIR很看好这款小数据库 今天偶然发现有很多国外的开发者开发了很多的IDE 有的2.2M,有的1M不到,有的22M..闷了..这一个IDE杂区别这么大呢.. 有个好的工具,就相当于有个好的助手,能更快的帮助开发 但到底是选哪一个开发工具呢?带着疑问我查了些数据!!( 一) sqliteadmin IDE大小:3.8M sqliteadmin 是一个开源社区开发的sqlite 目前支持的语言有17国的语言 当然里面也有中文 笔者感觉这个工具蛮不错的,开源的,免费也符合sqli...</summary><published>2012-02-21T08:50:00Z</published><updated>2012-02-21T08:50:00Z</updated><author><name>一修先生</name><uri>http://www.cnblogs.com/1971ruru/</uri></author><link rel="alternate" href="http://www.cnblogs.com/1971ruru/archive/2012/02/21/2361583.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/1971ruru/archive/2012/02/21/2361583.html"/><content type="html">&lt;table style="width: 100%;"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&#xD;
&lt;div id="contentMidPicAD" style="float: right; clear: both; top: 0; vertical-align: top;"&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;p align="left"&gt;SqLite 本是一个团队开发的小型数据库..因为小可以存为本地.并且可以离线访问,所以现在的FlashAIR很看好这款小数据库 &lt;br /&gt; 今天偶然发现有很多国外的开发者开发了很多的IDE &lt;br /&gt; 有的2.2M,有的1M不到,有的22M..闷了..这一个IDE杂区别这么大呢.. &lt;br /&gt; 有个好的工具,就相当于有个好的助手,能更快的帮助开发 &lt;br /&gt; 但到底是选哪一个开发工具呢?带着疑问我查了些数据!!&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;strong&gt;(&lt;/strong&gt; &lt;strong&gt;一) sqliteadmin &lt;/strong&gt; IDE大小:3.8M &lt;br /&gt; sqliteadmin 是一个开源社区开发的sqlite 目前支持的语言有17国的语言 &lt;br /&gt; 当然里面也有中文 &lt;br /&gt; &lt;br /&gt; 笔者感觉这个工具蛮不错的,开源的,免费也符合sqlite的原本精神!!! &lt;br /&gt; 并且支持中文.版本也在更新中!!强烈推荐之..&lt;/p&gt;&#xD;
&lt;p align="left"&gt;官方网址: &lt;a href="http://sqliteadmin.orbmu2k.de/" target="_bank"&gt;http://sqliteadmin.orbmu2k.de/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;(二) &lt;strong&gt;SQLiteSpy&lt;/strong&gt; IDE大小:1.86M &lt;br /&gt; &lt;br /&gt; SQLiteSpy是免费供个人和教育用途，SQLiteSpy主要特点： &lt;br /&gt; 1、数据库一览：树状显示所有的架构，包括表，列，索引和触发器在数据库中包含的项目。按F5更新架构树，双击一个表或视图来显示它的数据，使用常用的命令的上下文菜单。 &lt;br /&gt; 2、网格单元格编辑：表格单元格中编辑，显示一个表通过树状架构，选择一个单元格，然后按F2键调用编辑器。然后修改并确认您的更改写回到表里。 &lt;br /&gt; 3、数据类型显示：本机的SQL数据类型显示不同的背景颜色来帮助检测类型错误。类型错误可能会导致性能下降或错误的SELECT结果集，防止NULL值与空字符串混淆。 &lt;br /&gt; 4、完全的Unicode：SQLiteSpy具有完全支持SQLite的Unicode的能力。数据显示和输入是完全实现为Unicode，包括SQL命令。 &lt;br /&gt; 5、多个SQL编辑：现代标签是用来编辑和显示的查询语句和结果比较容易多个SQL查询。SQL查询执行输入或加载到SQL他们编辑。然后按F9键运行该查询，或Ctrl + F9来运行当前行或选择只。 &lt;br /&gt; 6、时间测量：SQL执行的时间会自动测量和显示，以帮助优化查询。 &lt;br /&gt; 7、正则表达式：在SQL关键字regexp是支持，并增加了完整的Perl的正则表达式语法5.10 SQLiteSpy。的实施，实现了利用DIRegEx库。 &lt;br /&gt; 8、数学SQL函数：下面的SQL函数可用数学除了SQLite的默认：ACOS(), ASIN(), ATAN(), ATAN(), ATAN2(), CEIL(), CEILING(), COS(), COT(), DEGREES(), EXP(), FLOOR(), LN(), LOG(), LOG(), LOG2(), LOG10(), MOD(), PI(), POW(), RADIANS(), SIGN(), SIN(), SQRT(), TAN(), TRUNCATE(). &lt;br /&gt; 9、数据压缩：压缩的SQL函数（）适用的zlib的紧缩到任何文本或BLOB值。 &lt;br /&gt; 10、紧凑型结果储存：使用内部数据存储机制，以达到最佳的兼容SQLite的原生数据类型。因此，SQLiteSpy使用远低于其它的SQLite管理内存和更有效地处理大量的表。 &lt;br /&gt; 11、内建的SQLite引擎：SQLiteSpy已建成一个单一的应用程序文件与SQLite数据库引擎可执行文件。不需要部署任何DLL文件，这使得SQLiteSpy更易于部署。 &lt;br /&gt; 12、加密支持：SQLiteSpy可以阅读和修改加密的数据库文件由DISQLite3产生。DISQLite3实现了自己的母语AES加密。这为不符合商业SQLite的加密扩展（SSE）的或任何其他第三方的实施提供兼容。 &lt;br /&gt; 13、易安装和卸载：要运行SQLiteSpy，只需解压SQLiteSpy.exe文件到任何目录和执行文件。不需要安装。刚开始时，该程序创建一个文件SQLiteSpy.db3（1 sqlite3的数据库）来存储的和设置。它不写任何其他文件或注册表。&lt;/p&gt;&#xD;
&lt;p align="left"&gt;官网址址: &lt;a href="http://www.yunqa.de/delphi/doku.php/products/sqlitespy/index" target="_bank"&gt;http://www.yunqa.de/delphi/doku.php/products/sqlitespy/index&lt;/a&gt; &lt;br /&gt; E文好的兄弟姐妹，可以直接去浏览看看！&lt;/p&gt;&#xD;
&lt;p align="left"&gt;(三) &lt;strong&gt;SQLite Expert Professional 3&lt;/strong&gt; IDE大小:23M左右 &lt;br /&gt; 简单介绍下 &lt;br /&gt; SQLite Expert 分Professional 3分为Professional 3和personal 3 &lt;br /&gt; 即个人版本和高级版本 &lt;br /&gt; 最大的区别在于:&lt;/p&gt;&#xD;
&lt;p align="left"&gt;它的免费版只比收费版少了数据导入导出,约束管理及触发器管理三块功能.&lt;/p&gt;&#xD;
&lt;p align="left"&gt;详细请看: &lt;a href="http://www.sqliteexpert.com/screenshots.html" target="_bank"&gt;http://www.sqliteexpert.com/screenshots.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;免费版的只是能够免费使用一段时间，过期不能再用(另外本文也帖出其破解方法)&lt;/p&gt;&#xD;
&lt;p align="left"&gt;目前大多是用的REG文件破解,即重写时间,让其时间更长久 &lt;br /&gt; 操作方法如下 &lt;br /&gt; 1)新建一个txt文档改名为 破解.reg &lt;br /&gt; &lt;br /&gt; 将以下代码Copy 在文件里-&amp;gt; 保存&lt;/p&gt;&#xD;
&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p align="left"&gt;1 &lt;br /&gt; 2 &lt;br /&gt; 3 &lt;br /&gt; 4&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p align="left"&gt;Windows Registry Editor Version 5.00 &lt;br /&gt; &lt;br /&gt; [HKEY_LOCAL_MACHINE\SOFTWARE\Sqlite Expert\3.x] &lt;br /&gt; "Install"="LHCBKPJOCFGAACIOEJHA"&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p align="left"&gt;&lt;br /&gt; 然后关闭,点击执行即可!!!&lt;/p&gt;&#xD;
&lt;p align="left"&gt;IDE下载地址: &lt;a href="http://www.sqliteexpert.com/download.html" target="_bank"&gt;http://www.sqliteexpert.com/download.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;!--  (责任编辑：admin)  --&gt;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&lt;img src="http://www.cnblogs.com/1971ruru/aggbug/2361583.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/1971ruru/archive/2012/02/21/2361583.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/1971ruru/archive/2012/02/20/2360267.html</id><title type="text">entity framework 数据库连接异常:基础提供程序在 Open 上失败</title><summary type="text">数据库连接字符串：serve=localhost。。。。。。。。。。。。排除未开启DTC服务等等各种可能原因，就剩下hosts文件被修改这个原因了。。本人下载的去广告版迅雷把hosts文件给修改了，导致提示如上错误，重新恢复一下hosts文件就连接成功了。记录分享之。</summary><published>2012-02-20T09:39:00Z</published><updated>2012-02-20T09:39:00Z</updated><author><name>一修先生</name><uri>http://www.cnblogs.com/1971ruru/</uri></author><link rel="alternate" href="http://www.cnblogs.com/1971ruru/archive/2012/02/20/2360267.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/1971ruru/archive/2012/02/20/2360267.html"/><content type="html">&lt;p&gt;数据库连接字符串：serve=localhost。。。。。。。。。。。。&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;排除未开启DTC服务等等各种可能原因，就剩下hosts文件被修改这个原因了。。&lt;/p&gt;&#xD;
&lt;p&gt;本人下载的去广告版迅雷把hosts文件给修改了，导致提示如上错误，重新恢复一下hosts文件就连接成功了。记录分享之。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/1971ruru/aggbug/2360267.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/1971ruru/archive/2012/02/20/2360267.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/1971ruru/archive/2012/02/20/2359972.html</id><title type="text">asp.net MVC 2 自定义用户角色权限设计</title><summary type="text">此地http://www.cnblogs.com/xiaoqi/archive/2011/01/24/1942880.html的博文，加上数据库，用entity framework稍作修改分享之。实体模型如下图：DBUserAuthorizeAttribute.cs如下DBUserAuthorizeAttribute.cs 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Mvc; 6 7 namespac...</summary><published>2012-02-20T08:18:00Z</published><updated>2012-02-20T08:18:00Z</updated><author><name>一修先生</name><uri>http://www.cnblogs.com/1971ruru/</uri></author><link rel="alternate" href="http://www.cnblogs.com/1971ruru/archive/2012/02/20/2359972.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/1971ruru/archive/2012/02/20/2359972.html"/><content type="html">&lt;p&gt;此地http://www.cnblogs.com/xiaoqi/archive/2011/01/24/1942880.html的博文，加上数据库，用entity framework稍作修改分享之。&lt;/p&gt;&#xD;
&lt;p&gt;实体模型如下图：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/48154/2012022016105210.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;DBUserAuthorizeAttribute.cs如下&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('d3727896-7ac9-4f75-804c-7b8fda877245')"&gt;&#xD;
&lt;div id="cnblogs_code_open_d3727896-7ac9-4f75-804c-7b8fda877245" &gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008080;"&gt;  1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: #008080;"&gt;  2&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: #008080;"&gt;  3&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color: #008080;"&gt;  4&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Web;&lt;br /&gt;&lt;span style="color: #008080;"&gt;  5&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Web.Mvc;&lt;br /&gt;&lt;span style="color: #008080;"&gt;  6&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;  7&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; MVCRole.Models&lt;br /&gt;&lt;span style="color: #008080;"&gt;  8&lt;/span&gt; {&lt;br /&gt;&lt;span style="color: #008080;"&gt;  9&lt;/span&gt;     &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 10&lt;/span&gt; &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 自定义AuthorizeAttribute&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 11&lt;/span&gt; &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 12&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; DBUserAuthorizeAttribute : AuthorizeAttribute&lt;br /&gt;&lt;span style="color: #008080;"&gt; 13&lt;/span&gt;     {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 14&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;  UserInfoEntities Database = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; UserInfoEntities();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 15&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; OnAuthorization( AuthorizationContext filterContext ) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 16&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (filterContext == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 17&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; ArgumentNullException( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;filterContext&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; );&lt;br /&gt;&lt;span style="color: #008080;"&gt; 18&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 19&lt;/span&gt;             User user = filterContext.HttpContext.Session[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CurrentUser&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; User;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 20&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; controller = filterContext.RouteData.Values[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;controller&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;].ToString();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 21&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; action = filterContext.RouteData.Values[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;action&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;].ToString();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 22&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; isAllowed = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.IsAllowed( user, controller, action );&lt;br /&gt;&lt;span style="color: #008080;"&gt; 23&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!isAllowed) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 24&lt;/span&gt;                 filterContext.HttpContext.Response.StatusCode = &lt;span style="color: #800080;"&gt;401&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 25&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 26&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 27&lt;/span&gt;         }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 28&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 29&lt;/span&gt;         &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 30&lt;/span&gt; &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 判断是否允许访问&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 31&lt;/span&gt; &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 32&lt;/span&gt; &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="user"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;用户&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 33&lt;/span&gt; &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="controller"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;控制器&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 34&lt;/span&gt; &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="action"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;action&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 35&lt;/span&gt; &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;是否允许访问&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 36&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; IsAllowed( User user, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; controller, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; action ) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 37&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 38&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 找controllerAction&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 39&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; controllerAction = Database.ControllerActions.FirstOrDefault( ca =&amp;gt; ca.IsController == &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt; &amp;amp;&amp;amp; ca.Name == action &amp;amp;&amp;amp; ca.ControllerName == controller );&lt;br /&gt;&lt;span style="color: #008080;"&gt; 40&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 41&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;action无记录，找controller&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 42&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (controllerAction == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 43&lt;/span&gt;                 controllerAction = Database.ControllerActions.FirstOrDefault( ca =&amp;gt; ca.IsController &amp;amp;&amp;amp; ca.Name == controller );&lt;br /&gt;&lt;span style="color: #008080;"&gt; 44&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 45&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 46&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 无规则&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 47&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (controllerAction == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 48&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 49&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 50&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 51&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 52&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 允许没有角色的：也就是说允许所有人，包括没有登录的用户 &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 53&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (controllerAction.IsAllowedNoneRoles) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 54&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 55&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 56&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (user==&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 57&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 58&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 59&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 允许所有角色：只要有角色，就可以访问 &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 60&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (controllerAction.IsAllowedAllRoles) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 61&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; count = Database.UserRoles.Count( ur =&amp;gt; ur.UserID == user.ID );&lt;br /&gt;&lt;span style="color: #008080;"&gt; 62&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (count &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 63&lt;/span&gt;                     &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 64&lt;/span&gt;                 }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 65&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 66&lt;/span&gt;                     &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 67&lt;/span&gt;                 }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 68&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 69&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 70&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 选出action对应的角色 &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 71&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; actionRoles = Database.ControllerActionRoles.ToList().FindAll( ca =&amp;gt; ca.ControllerActionID == controllerAction.ID );&lt;br /&gt;&lt;span style="color: #008080;"&gt; 72&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 73&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (actionRoles.Count == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 74&lt;/span&gt;                 &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 角色数量为0，也就是说没有定义访问规则，默认允许访问 &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 75&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 76&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 77&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; userHavedRolesids = Database.UserRoles.ToList().FindAll( ur =&amp;gt; ur.UserID == user.ID ).Select( ca =&amp;gt; ca.RoleID );&lt;br /&gt;&lt;span style="color: #008080;"&gt; 78&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 查找禁止的角色 &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 79&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; notAllowedRoles = actionRoles.FindAll( r =&amp;gt; !r.IsAllowed ).Select( ca =&amp;gt; ca.RoleID );&lt;br /&gt;&lt;span style="color: #008080;"&gt; 80&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (notAllowedRoles.Count() &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 81&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; roleId &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; notAllowedRoles) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 82&lt;/span&gt;                     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 用户的角色在禁止访问列表中，不允许访问 &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 83&lt;/span&gt;                     &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (userHavedRolesids.Contains( roleId )) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 84&lt;/span&gt;                         &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 85&lt;/span&gt;                     }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 86&lt;/span&gt;                 }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 87&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 88&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 查找允许访问的角色列表 &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 89&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; allowRoles = actionRoles.FindAll( r =&amp;gt; r.IsAllowed ).Select( ca =&amp;gt; ca.RoleID ).ToList();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 90&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (allowRoles.Count &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 91&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; roleId &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; allowRoles) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 92&lt;/span&gt;                     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 用户的角色在访问的角色列表 &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 93&lt;/span&gt;                     &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (userHavedRolesids.Contains( roleId )) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 94&lt;/span&gt;                         &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 95&lt;/span&gt;                     }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 96&lt;/span&gt;                 }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 97&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 98&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 默认禁止访问&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 99&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;100&lt;/span&gt;         }&lt;br /&gt;&lt;span style="color: #008080;"&gt;101&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;102&lt;/span&gt;     }&lt;br /&gt;&lt;span style="color: #008080;"&gt;103&lt;/span&gt; }&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div id="cnblogs_code_open_59900feb-995c-407a-acbd-8d0118e7098f" &gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008080;"&gt;  1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: #008080;"&gt;  2&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: #008080;"&gt;  3&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color: #008080;"&gt;  4&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Web;&lt;br /&gt;&lt;span style="color: #008080;"&gt;  5&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Web.Mvc;&lt;br /&gt;&lt;span style="color: #008080;"&gt;  6&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;  7&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; MVCRole.Models&lt;br /&gt;&lt;span style="color: #008080;"&gt;  8&lt;/span&gt; {&lt;br /&gt;&lt;span style="color: #008080;"&gt;  9&lt;/span&gt;     &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 10&lt;/span&gt; &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 自定义AuthorizeAttribute&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 11&lt;/span&gt; &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 12&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; DBUserAuthorizeAttribute : AuthorizeAttribute&lt;br /&gt;&lt;span style="color: #008080;"&gt; 13&lt;/span&gt;     {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 14&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;  UserInfoEntities Database = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; UserInfoEntities();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 15&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; OnAuthorization( AuthorizationContext filterContext ) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 16&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; user = filterContext.HttpContext.Session[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CurrentUser&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; User;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 17&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: #008080;"&gt; 18&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; controller = filterContext.RouteData.Values[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;controller&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;].ToString();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 19&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; action = filterContext.RouteData.Values[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;action&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;].ToString();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 20&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; isAllowed = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.IsAllowed( user, controller, action );&lt;br /&gt;&lt;span style="color: #008080;"&gt; 21&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 22&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!isAllowed) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 23&lt;/span&gt;                 filterContext.RequestContext.HttpContext.Response.Write( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;无权访问&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; );&lt;br /&gt;&lt;span style="color: #008080;"&gt; 24&lt;/span&gt;                 filterContext.RequestContext.HttpContext.Response.End();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 25&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 26&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 27&lt;/span&gt;         }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 28&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 29&lt;/span&gt;         &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 30&lt;/span&gt; &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 判断是否允许访问&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 31&lt;/span&gt; &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 32&lt;/span&gt; &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="user"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;用户&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 33&lt;/span&gt; &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="controller"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;控制器&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 34&lt;/span&gt; &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="action"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;action&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 35&lt;/span&gt; &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;是否允许访问&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 36&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; IsAllowed( User user, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; controller, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; action ) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 37&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 38&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 找controllerAction&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 39&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; controllerAction = Database.ControllerActions.FirstOrDefault( ca =&amp;gt; ca.IsController == &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt; &amp;amp;&amp;amp; ca.Name == action &amp;amp;&amp;amp; ca.ControllerName == controller );&lt;br /&gt;&lt;span style="color: #008080;"&gt; 40&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 41&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;action无记录，找controller&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 42&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (controllerAction == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 43&lt;/span&gt;                 controllerAction = Database.ControllerActions.FirstOrDefault( ca =&amp;gt; ca.IsController &amp;amp;&amp;amp; ca.Name == controller );&lt;br /&gt;&lt;span style="color: #008080;"&gt; 44&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 45&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 46&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 无规则&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 47&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (controllerAction == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 48&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 49&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 50&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 51&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 52&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 允许没有角色的：也就是说允许所有人，包括没有登录的用户 &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 53&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (controllerAction.IsAllowedNoneRoles) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 54&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 55&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 56&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (user==&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 57&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 58&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 59&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 允许所有角色：只要有角色，就可以访问 &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 60&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (controllerAction.IsAllowedAllRoles) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 61&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; count = Database.UserRoles.Count( ur =&amp;gt; ur.UserID == user.ID );&lt;br /&gt;&lt;span style="color: #008080;"&gt; 62&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (count &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 63&lt;/span&gt;                     &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 64&lt;/span&gt;                 }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 65&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 66&lt;/span&gt;                     &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 67&lt;/span&gt;                 }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 68&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 69&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 70&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 选出action对应的角色 &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 71&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; actionRoles = Database.ControllerActionRoles.ToList().FindAll( ca =&amp;gt; ca.ControllerActionID == controllerAction.ID );&lt;br /&gt;&lt;span style="color: #008080;"&gt; 72&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 73&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (actionRoles.Count == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 74&lt;/span&gt;                 &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 角色数量为0，也就是说没有定义访问规则，默认允许访问 &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 75&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 76&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 77&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; userHavedRolesids = Database.UserRoles.ToList().FindAll( ur =&amp;gt; ur.UserID == user.ID ).Select( ca =&amp;gt; ca.RoleID );&lt;br /&gt;&lt;span style="color: #008080;"&gt; 78&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 查找禁止的角色 &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 79&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; notAllowedRoles = actionRoles.FindAll( r =&amp;gt; !r.IsAllowed ).Select( ca =&amp;gt; ca.RoleID );&lt;br /&gt;&lt;span style="color: #008080;"&gt; 80&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (notAllowedRoles.Count() &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 81&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; roleId &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; notAllowedRoles) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 82&lt;/span&gt;                     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 用户的角色在禁止访问列表中，不允许访问 &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 83&lt;/span&gt;                     &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (userHavedRolesids.Contains( roleId )) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 84&lt;/span&gt;                         &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 85&lt;/span&gt;                     }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 86&lt;/span&gt;                 }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 87&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 88&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 查找允许访问的角色列表 &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 89&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; allowRoles = actionRoles.FindAll( r =&amp;gt; r.IsAllowed ).Select( ca =&amp;gt; ca.RoleID ).ToList();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 90&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (allowRoles.Count &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 91&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; roleId &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; allowRoles) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 92&lt;/span&gt;                     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 用户的角色在访问的角色列表 &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 93&lt;/span&gt;                     &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (userHavedRolesids.Contains( roleId )) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 94&lt;/span&gt;                         &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 95&lt;/span&gt;                     }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 96&lt;/span&gt;                 }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 97&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 98&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 默认禁止访问&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 99&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;100&lt;/span&gt;         }&lt;br /&gt;&lt;span style="color: #008080;"&gt;101&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;102&lt;/span&gt;     }&lt;br /&gt;&lt;span style="color: #008080;"&gt;103&lt;/span&gt; }&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('b6aa2fa4-70ba-4472-8e32-e1d1ef2e1d39')"&gt;&#xD;
&lt;div id="cnblogs_code_open_b6aa2fa4-70ba-4472-8e32-e1d1ef2e1d39" &gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Web;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Web.Mvc;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; MVCRole.Models;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; MVCRole.Controllers&lt;br /&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; {&lt;br /&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt;     [HandleError]&lt;br /&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt;     [DBUserAuthorize]&lt;br /&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; HomeController : Controller&lt;br /&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt;     {&lt;br /&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Index()&lt;br /&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt;         {&lt;br /&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt;             ViewData[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Message&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;欢迎使用 ASP.NET MVC!&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View();&lt;br /&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt;         }&lt;br /&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Admin()&lt;br /&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt;         {&lt;br /&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt;             ViewData[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Message&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;只有管理员才能访问!&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt;         }&lt;br /&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult User()&lt;br /&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt;         {&lt;br /&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt;             ViewData[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Message&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;只要是注册用户就能访问!&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;30&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;31&lt;/span&gt;         }&lt;br /&gt;&lt;span style="color: #008080;"&gt;32&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult UserOnly()&lt;br /&gt;&lt;span style="color: #008080;"&gt;33&lt;/span&gt;         {&lt;br /&gt;&lt;span style="color: #008080;"&gt;34&lt;/span&gt;             ViewData[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Message&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;只能是User才能能访问!&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;35&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;36&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;37&lt;/span&gt;         }&lt;br /&gt;&lt;span style="color: #008080;"&gt;38&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;39&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Login(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; user)&lt;br /&gt;&lt;span style="color: #008080;"&gt;40&lt;/span&gt;         {&lt;br /&gt;&lt;span style="color: #008080;"&gt;41&lt;/span&gt;             Session[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CurrentUser&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; UserInfoEntities().Users.FirstOrDefault(u =&amp;gt; u.UserName == user);&lt;br /&gt;&lt;span style="color: #008080;"&gt;42&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (Session[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CurrentUser&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: #008080;"&gt;43&lt;/span&gt;             {&lt;br /&gt;&lt;span style="color: #008080;"&gt;44&lt;/span&gt;                 ViewData[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Message&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;你已登录为&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + user;&lt;br /&gt;&lt;span style="color: #008080;"&gt;45&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt;46&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;47&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;48&lt;/span&gt;         }&lt;br /&gt;&lt;span style="color: #008080;"&gt;49&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;50&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;51&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult About()&lt;br /&gt;&lt;span style="color: #008080;"&gt;52&lt;/span&gt;         {&lt;br /&gt;&lt;span style="color: #008080;"&gt;53&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View();&lt;br /&gt;&lt;span style="color: #008080;"&gt;54&lt;/span&gt;         }&lt;br /&gt;&lt;span style="color: #008080;"&gt;55&lt;/span&gt;     }&lt;br /&gt;&lt;span style="color: #008080;"&gt;56&lt;/span&gt; }&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;流程：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/xiaoqi/201101/201101241000512381.png" alt="" width="524" height="755" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/1971ruru/aggbug/2359972.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/1971ruru/archive/2012/02/20/2359972.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/1971ruru/archive/2012/02/13/2349781.html</id><title type="text">c# .net 如何使用log4net记录日志</title><summary type="text">官方提供的下载中包含有详尽的说明文档。http://logging.apache.org/log4net/download_log4net.cgi需要提示的是如何在自己的WEB或者Winform项目中调用，以节约各位的时间。其实很简单，只要在：AssemblyInfo.cs中插入如下代码，即可成功调用//log4net.config 是配置文件的名称，可以自行设置//Watch 是表示在程序运行期间是否监视该配置文件的变动[assembly: log4net.Config.XmlConfigurator( ConfigFile = &amp;quot;bin\\log4net.config&amp;quot;</summary><published>2012-02-13T09:33:00Z</published><updated>2012-02-13T09:33:00Z</updated><author><name>一修先生</name><uri>http://www.cnblogs.com/1971ruru/</uri></author><link rel="alternate" href="http://www.cnblogs.com/1971ruru/archive/2012/02/13/2349781.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/1971ruru/archive/2012/02/13/2349781.html"/><content type="html">&lt;p&gt;官方提供的下载中包含有详尽的说明文档。&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://logging.apache.org/log4net/download_log4net.cgi" target="_blank"&gt;http://logging.apache.org/log4net/download_log4net.cgi&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;需要提示的是如何在自己的WEB或者Winform项目中调用，以节约各位的时间。其实很简单，只要在：AssemblyInfo.cs中插入如下代码，即可成功调用&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;log4net.config 是配置文件的名称，可以自行设置&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Watch 是表示在程序运行期间是否监视该配置文件的变动&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;[assembly: log4net.Config.XmlConfigurator( ConfigFile = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;bin\\log4net.config&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, Watch = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt; )]&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;调用示例：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; ILog log4User = LogManager.GetLogger( &amp;ldquo;logger-name&amp;rdquo; );&lt;br /&gt;log4User.Info( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;登录系统&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; );&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;配置文件示例&lt;/p&gt;&#xD;
&lt;p&gt;1、存入sqlserver&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('e27dce45-643b-42ed-8dbc-8e51307ac687')"&gt;&#xD;
&lt;div id="cnblogs_code_open_e27dce45-643b-42ed-8dbc-8e51307ac687" &gt;&#xD;
&lt;pre&gt;//log4net.config&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;xml version="1.0" encoding="utf-8" &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;log4net &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;debug&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="false"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;appender &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="AdoNetAppender_sqlserver"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="log4net.Appender.AdoNetAppender"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;bufferSize &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="1"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;connectionType &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="System.Data.SqlClient.SqlConnection"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;connectionString &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="data source=localhost;initial catalog=KioskPisInfo;integrated security=false;persist security info=True;User ID=kiosk;Password=kiosk"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;commandText &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="INSERT INTO L4Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;parameter&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;parameterName &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="@log_date"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;dbType &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="DateTime"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;layout &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="log4net.Layout.RawTimeStampLayout"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;parameter&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;parameter&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;parameterName &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="@thread"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;dbType &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="String"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;size &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="255"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;layout &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="log4net.Layout.PatternLayout"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;conversionPattern &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="%thread"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;layout&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;parameter&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;parameter&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;parameterName &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="@log_level"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;dbType &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="String"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;size &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="50"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;layout &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="log4net.Layout.PatternLayout"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;conversionPattern &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="%level"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;layout&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;parameter&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;parameter&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;parameterName &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="@logger"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;dbType &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="String"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;size &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="255"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;layout &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="log4net.Layout.PatternLayout"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;conversionPattern &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="%logger"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;layout&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;parameter&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;parameter&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;parameterName &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="@message"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;dbType &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="String"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;size &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="4000"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;layout &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="log4net.Layout.PatternLayout"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;conversionPattern &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="%message"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;layout&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;parameter&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;parameter&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;parameterName &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="@exception"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;dbType &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="String"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;size &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="2000"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;layout &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="log4net.Layout.ExceptionLayout"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;parameter&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;appender&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;root&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;level &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="DEBUG"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;appender-ref &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;ref&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="AdoNetAppender_sqlserver"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;root&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;log4net&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&amp;lt;bufferSize value="1" /&amp;gt;，&amp;nbsp;bufferSize为缓存容量，当log4net缓存的行数超过该值，才会把数据行插入数据库。&lt;/p&gt;&#xD;
&lt;p&gt;数据库对应表脚本&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('077eadf7-ce46-4c4f-80ad-e159e9e4cefb')"&gt;&#xD;
&lt;div id="cnblogs_code_open_077eadf7-ce46-4c4f-80ad-e159e9e4cefb" &gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;CREATE&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;TABLE&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;dbo&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;L4Log&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; (&lt;br /&gt;    &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Id&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;int&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #ff00ff;"&gt;IDENTITY&lt;/span&gt; (&lt;span style="color: #800000; font-weight: bold;"&gt;1&lt;/span&gt;, &lt;span style="color: #800000; font-weight: bold;"&gt;1&lt;/span&gt;) &lt;span style="color: #808080;"&gt;NOT&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;NULL&lt;/span&gt;,&lt;br /&gt;    &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Date&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;datetime&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #808080;"&gt;NOT&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;NULL&lt;/span&gt;,&lt;br /&gt;    &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Thread&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;varchar&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; (&lt;span style="color: #800000; font-weight: bold;"&gt;255&lt;/span&gt;) &lt;span style="color: #808080;"&gt;NOT&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;NULL&lt;/span&gt;,&lt;br /&gt;    &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Level&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;varchar&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; (&lt;span style="color: #800000; font-weight: bold;"&gt;50&lt;/span&gt;) &lt;span style="color: #808080;"&gt;NOT&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;NULL&lt;/span&gt;,&lt;br /&gt;    &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Logger&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;varchar&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; (&lt;span style="color: #800000; font-weight: bold;"&gt;255&lt;/span&gt;) &lt;span style="color: #808080;"&gt;NOT&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;NULL&lt;/span&gt;,&lt;br /&gt;    &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Message&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;varchar&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; (&lt;span style="color: #800000; font-weight: bold;"&gt;4000&lt;/span&gt;) &lt;span style="color: #808080;"&gt;NOT&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;NULL&lt;/span&gt;,&lt;br /&gt;    &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Exception&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;varchar&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; (&lt;span style="color: #800000; font-weight: bold;"&gt;2000&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;NULL&lt;/span&gt;&lt;br /&gt;)&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;2、存入文本中&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('7c5fbfa0-dddf-4034-a161-f27dd165cf06')"&gt;&#xD;
&lt;div id="cnblogs_code_open_7c5fbfa0-dddf-4034-a161-f27dd165cf06" &gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;xml version="1.0" encoding="utf-8" &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;log4net &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;debug&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="false"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;appender &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="RollingLogFileAppender"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="log4net.Appender.RollingFileAppender"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;file &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="c:\kiosklog\ws.txt"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;appendToFile &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="true"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;rollingStyle &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Size"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;maxSizeRollBackups &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="10"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;maximumFileSize &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="600KB"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;staticLogFileName &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="true"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;layout &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="log4net.Layout.PatternLayout"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;conversionPattern &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="发生时间：%date%n事件级别：%-5level%n事件来源：%logger%n日志内容：%m%n------------------------------%n"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;layout&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;appender&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;root&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;level &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="WARN"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;appender-ref &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;ref&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="RollingLogFileAppender"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;root&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;log4net&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/1971ruru/aggbug/2349781.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/1971ruru/archive/2012/02/13/2349781.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/1971ruru/archive/2012/02/09/2343718.html</id><title type="text">C#遍历CookieContainer所有Cookie并保存到文件</title><summary type="text">在开HTTP方式提交数据时，有的要登录才能发送数据，如果每次都登录，那就有点浪费时间了，因为网络的问题，很多时间都花来回传输数据上，如果登录后把CookieContainer保存到文件或数据库那就会快很多了。保存CookieContainer考虑到两种方法，一种是把CookieContainer序列化，再保存,用的时候再反序列化；另一种是遍历出所有的Cookie,再把内容读出来，用的时候再构建新有Cookie,再添加到CookieContainer。经过考虑，决定用第二种，因为Cookie会有时间限制，如果单单的序列化后保存，就有可能会过期，而后一种则可以自己设置时间。以下的代码可以适用于很多</summary><published>2012-02-09T03:46:00Z</published><updated>2012-02-09T03:46:00Z</updated><author><name>一修先生</name><uri>http://www.cnblogs.com/1971ruru/</uri></author><link rel="alternate" href="http://www.cnblogs.com/1971ruru/archive/2012/02/09/2343718.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/1971ruru/archive/2012/02/09/2343718.html"/><content type="html">在开HTTP方式提交数据时，有的要登录才能发送数据，如果每次都登录，那就有点浪费时间了，因为网络的问题，很多时间都花来回传输数据上，如果登录后把CookieContainer保存到文件或数据库那就会快很多了。&lt;br /&gt;&#xD;
保存CookieContainer考虑到两种方法，一种是把CookieContainer序列化，再保存,用的时候再反序列化；另一种是遍历出所有的Cookie,再把内容读出来，用的时候再构建新有Cookie,再添加到CookieContainer。经过考虑，决定用第二种，因为Cookie会有时间限制，如果单单的序列化后保存，就有可能会过期，而后一种则可以自己设置时间。&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
以下的代码可以适用于很多场合，包括论坛，社区，甚至某些邮箱等。当然此处我只是举例，将内容保存到一个文本文件，而实际可可以保存到数据库或其他地方。&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
首先，我们用一个方法把CookieContainer所有的Cookie读出来，此方法的代码：&lt;br /&gt;&#xD;
public static List&amp;lt;Cookie&amp;gt; GetAllCookies(CookieContainer cc)&lt;br /&gt;&#xD;
{&lt;br /&gt;&#xD;
List&amp;lt;Cookie&amp;gt; lstCookies = new List&amp;lt;Cookie&amp;gt;();&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
Hashtable table = (Hashtable)cc.GetType().InvokeMember("m_domainTable",&lt;br /&gt;&#xD;
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField |&lt;br /&gt;&#xD;
System.Reflection.BindingFlags.Instance, null, cc, new object[] { });&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
foreach (object pathList in table.Values)&lt;br /&gt;&#xD;
{&lt;br /&gt;&#xD;
SortedList lstCookieCol = (SortedList)pathList.GetType().InvokeMember("m_list",&lt;br /&gt;&#xD;
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField&lt;br /&gt;&#xD;
| System.Reflection.BindingFlags.Instance, null, pathList, new object[] { });&lt;br /&gt;&#xD;
foreach (CookieCollection colCookies in lstCookieCol.Values)&lt;br /&gt;&#xD;
foreach (Cookie c in colCookies) lstCookies.Add(c);&lt;br /&gt;&#xD;
}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
return lstCookies;&lt;br /&gt;&#xD;
}&lt;br /&gt;&#xD;
然后我们再保存到文件：&lt;br /&gt;&#xD;
StringBuilder sbc = new StringBuilder();&lt;br /&gt;&#xD;
List&amp;lt;Cookie&amp;gt; cooklist = Code.ProgTool.GetAllCookies(CookieContainer);&lt;br /&gt;&#xD;
foreach (Cookie cookie in cooklist)&lt;br /&gt;&#xD;
{&lt;br /&gt;&#xD;
sbc.AppendFormat("{0};{1};{2};{3};{4};{5}\r\n",&lt;br /&gt;&#xD;
cookie.Domain,cookie.Name, cookie.Path, cookie.Port, &lt;br /&gt;&#xD;
cookie.Secure.ToString(), cookie.Value);&lt;br /&gt;&#xD;
}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
FileStream fs = File.Create("d:\\chinarencookies.txt");&lt;br /&gt;&#xD;
fs.Close();&lt;br /&gt;&#xD;
File.WriteAllText("d:\\chinarencookies.txt", sbc.ToString(), System.Text.Encoding.Default);&lt;br /&gt;&#xD;
读出所有Cookie&lt;br /&gt;&#xD;
string[] cookies = File.ReadAllText("d:\\chinarencookies.txt", System.Text.Encoding.Default).Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);&lt;br /&gt;&#xD;
foreach (string c in cookies)&lt;br /&gt;&#xD;
{&lt;br /&gt;&#xD;
string[] cc = c.Split(";".ToCharArray());&lt;br /&gt;&#xD;
Cookie ck = new Cookie(); ;&lt;br /&gt;&#xD;
ck.Discard =false;&lt;br /&gt;&#xD;
ck.Domain = cc[0];&lt;br /&gt;&#xD;
ck.Expired =true;                &lt;br /&gt;&#xD;
ck.HttpOnly = true;&lt;br /&gt;&#xD;
ck.Name = cc[1];&lt;br /&gt;&#xD;
ck.Path = cc[2];&lt;br /&gt;&#xD;
ck.Port = cc[3];&lt;br /&gt;&#xD;
ck.Secure = bool.Parse(cc[4]);&lt;br /&gt;&#xD;
ck.Value = cc[5];&lt;br /&gt;&#xD;
CookieContainer.Add(ck);&lt;br /&gt;&#xD;
}&lt;br /&gt;&#xD;
&lt;img src="http://www.cnblogs.com/1971ruru/aggbug/2343718.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/1971ruru/archive/2012/02/09/2343718.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/1971ruru/archive/2012/02/03/2337378.html</id><title type="text">常用正则表达式</title><summary type="text">匹配中文字符的正则表达式： [\u4e00-\u9fa5]评注：匹配中文还真是个头疼的事，有了这个表达式就好办了匹配双字节字符(包括汉字在内)：[^\x00-\xff]评注：可以用来计算字符串的长度（一个双字节字符长度计2，ASCII字符计1）匹配空白行的正则表达式：\n\s*\r评注：可以用来删除空白行匹配HTML标记的正则表达式：&amp;lt;(\S*?)[^&amp;gt;]*&amp;gt;.*?&amp;lt;/\1&amp;gt;|&amp;lt;.*? /&amp;gt;评注：网上流传的版本太糟糕，上面这个也仅仅能匹配部分，对于复杂的嵌套标记依旧无能为力匹配首尾空白字符的正则表达式：^\s*|\s*$评注：可以用来删除行首行尾的空白</summary><published>2012-02-03T09:22:00Z</published><updated>2012-02-03T09:22:00Z</updated><author><name>一修先生</name><uri>http://www.cnblogs.com/1971ruru/</uri></author><link rel="alternate" href="http://www.cnblogs.com/1971ruru/archive/2012/02/03/2337378.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/1971ruru/archive/2012/02/03/2337378.html"/><content type="html">匹配中文字符的正则表达式： [\u4e00-\u9fa5]&lt;br /&gt;&#xD;
评注：匹配中文还真是个头疼的事，有了这个表达式就好办了&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
匹配双字节字符(包括汉字在内)：[^\x00-\xff]&lt;br /&gt;&#xD;
评注：可以用来计算字符串的长度（一个双字节字符长度计2，ASCII字符计1）&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
匹配空白行的正则表达式：\n\s*\r&lt;br /&gt;&#xD;
评注：可以用来删除空白行&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
匹配HTML标记的正则表达式：&amp;lt;(\S*?)[^&amp;gt;]*&amp;gt;.*?&amp;lt;/\1&amp;gt;|&amp;lt;.*? /&amp;gt;&lt;br /&gt;&#xD;
评注：网上流传的版本太糟糕，上面这个也仅仅能匹配部分，对于复杂的嵌套标记依旧无能为力&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
匹配首尾空白字符的正则表达式：^\s*|\s*$&lt;br /&gt;&#xD;
评注：可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等)，非常有用的表达式&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
匹配Email地址的正则表达式：\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*&lt;br /&gt;&#xD;
评注：表单验证时很实用&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
匹配网址URL的正则表达式：[a-zA-z]+://[^\s]*&lt;br /&gt;&#xD;
评注：网上流传的版本功能很有限，上面这个基本可以满足需求&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
匹配帐号是否合法(字母开头，允许5-16字节，允许字母数字下划线)：^[a-zA-Z][a-zA-Z0-9_]{4,15}$&lt;br /&gt;&#xD;
评注：表单验证时很实用&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
匹配国内电话号码：\d{3}-\d{8}|\d{4}-\d{7}&lt;br /&gt;&#xD;
评注：匹配形式如 0511-4405222 或 021-87888822&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
匹配腾讯QQ号：[1-9][0-9]{4,}&lt;br /&gt;&#xD;
评注：腾讯QQ号从10000开始&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
匹配中国邮政编码：[1-9]\d{5}(?!\d)&lt;br /&gt;&#xD;
评注：中国邮政编码为6位数字&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
匹配身份证：\d{15}|\d{18}&lt;br /&gt;&#xD;
评注：中国的身份证为15位或18位&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
匹配ip地址：\d+\.\d+\.\d+\.\d+&lt;br /&gt;&#xD;
&lt;pre&gt;&amp;lt;(?&#xD;
&lt;htmltag&gt;&#xD;
[\w]+)[^&amp;gt;]*\s[iI][dD]=(?&lt;quote&gt;["']?)footer(?(Quote)\k&lt;quote&gt;)["']?[^&amp;gt;]*&amp;gt;((?&lt;nested&gt;&amp;lt;\k&#xD;
&lt;htmltag&gt;&#xD;
[^&amp;gt;]*&amp;gt;)|&lt;!--\k&#xD;
&lt;HtmlTag--&gt;&#xD;
&amp;gt;(?&amp;lt;-Nested&amp;gt;)|.*?)*&lt;!--\k&#xD;
&lt;HtmlTag--&gt;&#xD;
&amp;gt;&lt;/pre&gt;&#xD;
评注：提取ip地址时有用&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
匹配特定数字：&lt;br /&gt;&#xD;
^[1-9]\d*$　 　 //匹配正整数&lt;br /&gt;&#xD;
^-[1-9]\d*$ 　 //匹配负整数&lt;br /&gt;&#xD;
^-?[1-9]\d*$　　 //匹配整数&lt;br /&gt;&#xD;
^[1-9]\d*|0$　 //匹配非负整数（正整数 + 0）&lt;br /&gt;&#xD;
^-[1-9]\d*|0$　　 //匹配非正整数（负整数 + 0）&lt;br /&gt;&#xD;
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$　　 //匹配正浮点数&lt;br /&gt;&#xD;
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$　 //匹配负浮点数&lt;br /&gt;&#xD;
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$　 //匹配浮点数&lt;br /&gt;&#xD;
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$　　 //匹配非负浮点数（正浮点数 + 0）&lt;br /&gt;&#xD;
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$　　//匹配非正浮点数（负浮点数 + 0）&lt;br /&gt;&#xD;
评注：处理大量数据时有用，具体应用时注意修正&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
匹配特定字符串：&lt;br /&gt;&#xD;
^[A-Za-z]+$　　//匹配由26个英文字母组成的字符串&lt;br /&gt;&#xD;
^[A-Z]+$　　//匹配由26个英文字母的大写组成的字符串&lt;br /&gt;&#xD;
^[a-z]+$　　//匹配由26个英文字母的小写组成的字符串&lt;br /&gt;&#xD;
^[A-Za-z0-9]+$　　//匹配由数字和26个英文字母组成的字符串&lt;br /&gt;&#xD;
&lt;p&gt;^\w+$　　//匹配由数字、26个英文字母或者下划线组成的字符串&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;(?&amp;lt;HtmlTag&amp;gt;[\w]+)[^&amp;gt;]*\s[iI][dD]=(?&amp;lt;Quote&amp;gt;["']?)footer(?(Quote)\k&amp;lt;Quote&amp;gt;)["']?[^&amp;gt;]*&amp;gt;((?&amp;lt;Nested&amp;gt;&amp;lt;\k&amp;lt;HtmlTag&amp;gt;[^&amp;gt;]*&amp;gt;)|&amp;lt;/\k&amp;lt;HtmlTag&amp;gt;&amp;gt;(?&amp;lt;-Nested&amp;gt;)|.*?)*&amp;lt;/\k&amp;lt;HtmlTag&amp;gt;&amp;gt;&lt;br /&gt;&#xD;
&lt;/p&gt;&#xD;
评注：最基本也是最常用的一些表达式&lt;br /&gt;&#xD;
&lt;img src="http://www.cnblogs.com/1971ruru/aggbug/2337378.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/1971ruru/archive/2012/02/03/2337378.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/1971ruru/archive/2012/01/31/2333775.html</id><title type="text">C#:正则表达式30分钟入门教程</title><summary type="text">目录跳过目录 本文目标 如何使用本教程 正则表达式到底是什么东西？ 入门 测试正则表达式 元字符 字符转义 重复 字符类 分枝条件 反义 分组 后向引用 零宽断言 负向零宽断言 注释 贪婪与懒惰 处理选项 ...</summary><published>2012-01-31T09:13:00Z</published><updated>2012-01-31T09:13:00Z</updated><author><name>一修先生</name><uri>http://www.cnblogs.com/1971ruru/</uri></author><link rel="alternate" href="http://www.cnblogs.com/1971ruru/archive/2012/01/31/2333775.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/1971ruru/archive/2012/01/31/2333775.html"/><content type="html">&lt;style type="text/css"&gt;&#xD;
p {text-indent:2em; line-height:140%; margin:5px 20px}&#xD;
span {margin:3px}&#xD;
table {margin:auto; border-style:solid; border-width:1px 1px 0 0; border-color:gray; background:#eee;}&#xD;
td, th {border-style:solid; border-width:0 0 1px 1px; border-color:gray}&#xD;
caption {margin:auto; font-weight:bold}&#xD;
dl {margin-left:20px}&#xD;
dt {font-weight:bold}&#xD;
em {font-style:normal; font-weight:bold; }&#xD;
.webStandards {text-align:right; font-size:80%; color: gray;}&#xD;
.webStandards a {text-align:right; font-size:small; color: gray;}&#xD;
#ad2 { border: solid 1px #eee; margin-bottom:60px; margin-top:30px; clear:right; }&#xD;
.note, #ad1 { float:right; width:300px; padding:5px; background-color:#eee; border:solid 1px gray; clear:right;}&#xD;
#meta {text-align: center}&#xD;
.important {color:orange;}&#xD;
.name {font-weight:bold}&#xD;
.code {color:blue}&#xD;
.regex {color:red}&#xD;
.part {color:green}&#xD;
.string {font-style:italic}&#xD;
.desc {text-decoration:underline}&#xD;
#clearButton,#hideButton {text-decoration:none; border:solid 1px gray; background-color:#eee;}&#xD;
#top {background:#eee; line-height:200%;}&#xD;
#top a {text-decoration: none; vertical-align:middle; color:Black; display:block; display:inline-block; text-align: center; padding:3px 15px; }&#xD;
#top a:hover { background:#ccc;}&#xD;
&lt;/style&gt;&#xD;
&lt;h2 id="contents"&gt;目录&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p id="skipContents" &gt;&lt;a href="http://www.cnblogs.com/1971ruru/admin/EditPosts.aspx?opt=1#mission" title="转到正文内容"&gt;跳过目录&lt;/a&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.cnblogs.com/1971ruru/admin/EditPosts.aspx?opt=1#mission"&gt;本文目标&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.cnblogs.com/1971ruru/admin/EditPosts.aspx?opt=1#howtouse"&gt;如何使用本教程&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.cnblogs.com/1971ruru/admin/EditPosts.aspx?opt=1#introduction"&gt;正则表达式到底是什么东西？&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.cnblogs.com/1971ruru/admin/EditPosts.aspx?opt=1#getstarted"&gt;入门&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.cnblogs.com/1971ruru/admin/EditPosts.aspx?opt=1#testing"&gt;测试正则表达式&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.cnblogs.com/1971ruru/admin/EditPosts.aspx?opt=1#metacode"&gt;元字符&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.cnblogs.com/1971ruru/admin/EditPosts.aspx?opt=1#escape"&gt;字符转义&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.cnblogs.com/1971ruru/admin/EditPosts.aspx?opt=1#repeat"&gt;重复&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.cnblogs.com/1971ruru/admin/EditPosts.aspx?opt=1#charclass"&gt;字符类&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.cnblogs.com/1971ruru/admin/EditPosts.aspx?opt=1#alternative"&gt;分枝条件&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.cnblogs.com/1971ruru/admin/EditPosts.aspx?opt=1#negation"&gt;反义&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.cnblogs.com/1971ruru/admin/EditPosts.aspx?opt=1#grouping"&gt;分组&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.cnblogs.com/1971ruru/admin/EditPosts.aspx?opt=1#backreference"&gt;后向引用&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.cnblogs.com/1971ruru/admin/EditPosts.aspx?opt=1#lookaround"&gt;零宽断言&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.cnblogs.com/1971ruru/admin/EditPosts.aspx?opt=1#negativelookaround"&gt;负向零宽断言&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.cnblogs.com/1971ruru/admin/EditPosts.aspx?opt=1#commenting"&gt;注释&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.cnblogs.com/1971ruru/admin/EditPosts.aspx?opt=1#greedyandlazy"&gt;贪婪与懒惰&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.cnblogs.com/1971ruru/admin/EditPosts.aspx?opt=1#regexoptions"&gt;处理选项&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.cnblogs.com/1971ruru/admin/EditPosts.aspx?opt=1#balancedgroup"&gt;平衡组/递归匹配&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.cnblogs.com/1971ruru/admin/EditPosts.aspx?opt=1#more"&gt;还有些什么东西没提到&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.cnblogs.com/1971ruru/admin/EditPosts.aspx?opt=1#contact"&gt;联系作者&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.cnblogs.com/1971ruru/admin/EditPosts.aspx?opt=1#resources"&gt;网上的资源及本文参考文献&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.cnblogs.com/1971ruru/admin/EditPosts.aspx?opt=1#updatelog"&gt;更新纪录&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;h2 id="mission"&gt;本文目标&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;30分钟内让你明白正则表达式是什么，并对它有一些基本的了解，让你可以在自己的程序或网页里使用它。&lt;/p&gt;&#xD;
&lt;h2 id="howtouse"&gt;如何使用本教程&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p id="giveMe30Minutes" &gt;最重要的是&amp;#8212;&amp;#8212;请给我&#xD;
&lt;em&gt;30分钟&lt;/em&gt;&#xD;
，如果你没有使用正则表达式的经验，请不要试图在30&#xD;
&lt;em&gt;秒&lt;/em&gt;&#xD;
内入门&amp;#8212;&amp;#8212;除非你是超人 :)&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;别被下面那些复杂的表达式吓倒，只要跟着我一步一步来，你会发现正则表达式其实并&#xD;
&lt;span lang="zh-cn"&gt;没有&lt;/span&gt;&#xD;
你想像中的那么困难。当然，如果你看完了这篇教程之后，发现自己明白了很多，却又几乎什么都记不得，那也是很正常的&amp;#8212;&amp;#8212;我认为，没接触过正则表达式的人在看完这篇教程后，能把提到过的语法记住80%以上的可能性为零。这里只是让你明白基本的原理，以后你还需要多练习，多使用，才能熟练掌握正则表达式。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;除了作为入门教程之外，本文还试图成为可以在日常工作中使用的正则表达式语法参考手册。就作者本人的经历来说，这个目标还是完成得不错的&amp;#8212;&amp;#8212;你看，我自己也没能把所有的东西记下来，不是吗？&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://deerchao.net/tutorials/regex/regex.htm" id="clearButton" onclick="return clearFormats();"&gt;清除格式&lt;/a&gt;&#xD;
文本格式约定：&#xD;
&lt;span &gt;专业术语&lt;/span&gt;&#xD;
&lt;span &gt;元字符/语法格式&lt;/span&gt;&#xD;
&lt;span &gt;正则表达式&lt;/span&gt;&#xD;
&lt;span &gt;正则表达式中的一部分(用于分析)&lt;/span&gt;&#xD;
&lt;span &gt;对其进行匹配的源字符串&lt;/span&gt;&#xD;
&lt;span &gt;对正则表达式或其中一部分的说明&lt;/span&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://deerchao.net/tutorials/regex/regex.htm" id="hideButton" onclick="return hideNotes();"&gt;隐藏边注&lt;/a&gt;&#xD;
本文右边有一些注释，主要是用来提供一些相关信息，或者给没有程序员背景的读者解释一些基本概念，通常可以忽略。&#xD;
&lt;/p&gt;&#xD;
&lt;h2 id="introduction"&gt;正则表达式到底是什么东西？&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;span &gt;字符&lt;/span&gt;&#xD;
是计算机软件处理文字时最基本的单位，可能是字母，数字，标点符号，空格，换行符，汉字等等。&#xD;
&lt;span &gt;字符串&lt;/span&gt;&#xD;
是0个或更多个字符的序列。&#xD;
&lt;span &gt;文本&lt;/span&gt;&#xD;
也就是文字，字符串。说某个字符串&#xD;
&lt;span &gt;匹配&lt;/span&gt;&#xD;
某个正则表达式，通常是指这个字符串里有一部分（或几部分分别）能满足表达式给出的条件。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;在编写处理字符串的程序或网页时，经常会有查找符合某些复杂规则的字符串的需要。&#xD;
&lt;span &gt;正则表达式&lt;/span&gt;&#xD;
就是用于描述这些规则的工具。换句话说，正则表达式就是记录文本规则的代码。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;很可能你使用过Windows/Dos下用于文件查找的&#xD;
&lt;span &gt;通配符(wildcard)&lt;/span&gt;&#xD;
，也就是&#xD;
&lt;span &gt;*&lt;/span&gt;&#xD;
和&#xD;
&lt;span &gt;?&lt;/span&gt;&#xD;
。如果你想查找某个目录下的所有的Word文档的话，你会搜索&#xD;
&lt;span style="color: red;"&gt;*.doc&lt;/span&gt;&#xD;
。在这里，&#xD;
&lt;span &gt;*&lt;/span&gt;&#xD;
会被解释成任意的字符串。和通配符类似，正则表达式也是用来进行文本匹配的工具，只不过比起通配符，它能更精确地描述你的需求&amp;#8212;&amp;#8212;当然，代价就是更复杂&amp;#8212;&amp;#8212;比如你可以编写一个正则表达式，用来查找&#xD;
&lt;span &gt;所有以0开头，后面跟着2-3个数字，然后是一个连字号&amp;#8220;-&amp;#8221;，最后是7或8位数字的字符串&lt;/span&gt;&#xD;
(像&#xD;
&lt;span &gt;010-12345678&lt;/span&gt;&#xD;
或&#xD;
&lt;span &gt;0376-7654321&lt;/span&gt;&#xD;
)。&#xD;
&lt;/p&gt;&#xD;
&lt;h2 id="getstarted"&gt;入门&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;学习正则表达式的最好方法是从例子开始，理解例子之后再自己对例子进行修改，实验。下面给出了不少简单的例子，并对它们作了详细的说明。&lt;/p&gt;&#xD;
&lt;p&gt;假设你在一篇英文小说里查找&#xD;
&lt;span &gt;hi&lt;/span&gt;&#xD;
，你可以使用正则表达式&#xD;
&lt;span &gt;hi&lt;/span&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;这几乎是最简单的正则表达式了，它可以精确匹配这样的字符串：&#xD;
&lt;span &gt;由两个字符组成，前一个字符是h,后一个是i&lt;/span&gt;&#xD;
。通常，处理正则表达式的工具会提供一个忽略大小写的选项，如果选中了这个选项，它可以匹配&#xD;
&lt;span &gt;hi&lt;/span&gt;&#xD;
,&#xD;
&lt;span &gt;HI&lt;/span&gt;&#xD;
,&#xD;
&lt;span &gt;Hi&lt;/span&gt;&#xD;
,&#xD;
&lt;span &gt;hI&lt;/span&gt;&#xD;
这四种情况中的任意一种。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;不幸的是，很多单词里包含&#xD;
&lt;span &gt;hi&lt;/span&gt;&#xD;
这两个连续的字符，比如&#xD;
&lt;span &gt;him&lt;/span&gt;&#xD;
,&#xD;
&lt;span &gt;history&lt;/span&gt;&#xD;
,&#xD;
&lt;span &gt;high&lt;/span&gt;&#xD;
等等。用&#xD;
&lt;span &gt;hi&lt;/span&gt;&#xD;
来查找的话，这里边的&#xD;
&lt;span &gt;hi&lt;/span&gt;&#xD;
也会被找出来。如果要&#xD;
&lt;span &gt;精确地查找hi这个单词&lt;/span&gt;&#xD;
的话，我们应该使用&#xD;
&lt;span &gt;\bhi\b&lt;/span&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;\b&lt;/span&gt;&#xD;
是正则表达式规定的一个特殊代码（好吧，某些人叫它&#xD;
&lt;span &gt;元字符，metacharacter&lt;/span&gt;&#xD;
），代表着&#xD;
&lt;span &gt;单词的开头或结尾，也就是单词的分界处&lt;/span&gt;&#xD;
。虽然通常英文的单词是由空格，标点符号或者换行来分隔的，但是&#xD;
&lt;span &gt;\b&lt;/span&gt;&#xD;
并不匹配这些单词分隔字符中的任何一个，它&#xD;
&lt;strong&gt;只匹配一个位置&lt;/strong&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;p &gt;如果需要更精确的说法，&#xD;
&lt;span &gt;\b&lt;/span&gt;&#xD;
匹配这样的位置：它的前一个字符和后一个字符不全是(一个是,一个不是或不存在)&#xD;
&lt;span &gt;\w&lt;/span&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;假如你要找的是&#xD;
&lt;span &gt;hi后面不远处跟着一个Lucy&lt;/span&gt;&#xD;
，你应该用&#xD;
&lt;span &gt;\bhi\b.*\bLucy\b&lt;/span&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;这里，&#xD;
&lt;span &gt;.&lt;/span&gt;&#xD;
是另一个元字符，匹配&#xD;
&lt;span &gt;除了换行符以外的任意字符&lt;/span&gt;&#xD;
。&#xD;
&lt;span &gt;*&lt;/span&gt;&#xD;
同样是元字符，不过它代表的不是字符，也不是位置，而是数量&amp;#8212;&amp;#8212;它指定*&#xD;
&lt;span &gt;前边的内容可以连续重复使用任意次以使整个表达式得到匹配&lt;/span&gt;&#xD;
。因此，&#xD;
&lt;span &gt;.*&lt;/span&gt;&#xD;
连在一起就意味着&#xD;
&lt;span &gt;任意数量的不包含换行的字符&lt;/span&gt;&#xD;
。现在&#xD;
&lt;span &gt;\bhi\b.*\bLucy\b&lt;/span&gt;&#xD;
的意思就很明显了：&#xD;
&lt;span &gt;先是一个单词hi,然后是任意个任意字符(但不能是换行)，最后是Lucy这个单词&lt;/span&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;p &gt;换行符就是'\n',ASCII编码为10(十六进制0x0A)的字符。&lt;/p&gt;&#xD;
&lt;p&gt;如果同时使用其它元字符，我们就能构造出功能更强大的正则表达式。比如下面这个例子：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;0\d\d-\d\d\d\d\d\d\d\d&lt;/span&gt;&#xD;
匹配这样的字符串：&#xD;
&lt;span &gt;以0开头，然后是两个数字，然后是一个连字号&amp;#8220;-&amp;#8221;，最后是8个数字&lt;/span&gt;&#xD;
(也就是中国的电话号码。当然，这个例子只能匹配区号为3位的情形)。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;这里的&#xD;
&lt;span &gt;\d&lt;/span&gt;&#xD;
是个新的元字符，匹配&#xD;
&lt;span &gt;一位数字(0，或1，或2，或&amp;#8230;&amp;#8230;)&lt;/span&gt;&#xD;
。&#xD;
&lt;span &gt;-&lt;/span&gt;&#xD;
不是元字符，只匹配它本身&amp;#8212;&amp;#8212;连字符(或者减号，或者中横线，或者随你怎么称呼它)。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;为了避免那么多烦人的重复，我们也可以这样写这个表达式：&#xD;
&lt;span &gt;0\d{2}-\d{8}&lt;/span&gt;&#xD;
。&#xD;
这里&#xD;
&lt;span &gt;\d&lt;/span&gt;&#xD;
后面的&#xD;
&lt;span &gt;{2}&lt;/span&gt;&#xD;
(&#xD;
&lt;span &gt;{8}&lt;/span&gt;&#xD;
)的意思是前面&#xD;
&lt;span &gt;\d&lt;/span&gt;&#xD;
&lt;span &gt;必须连续重复匹配2次(8次)&lt;/span&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;h2 id="testing"&gt;测试正则表达式&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;其它可用的测试工具:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.regexbuddy.com/"&gt;RegexBuddy&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://regexpal.com/"&gt;Javascript正则表达式在线测试工具&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;如果你不觉得正则表达式很难读写的话，要么你是一个天才，要么，你不是地球人。正则表达式的语法很令人头疼，即使对经常使用它的人来说也是如此。由于难于读写，容易出错，所以找一种工具对正则表达式进行测试是很有必要的。&lt;/p&gt;&#xD;
&lt;p&gt;不同的环境下正则表达式的一些细节是不相同的，本教程介绍的是微软 .Net Framework 4.0 下正则表达式的行为，所以，我向你推荐我编写的.Net下的工具&#xD;
&lt;a title="转到RegexTester页面" href="http://www.cnblogs.com/tools/regex_tester/index.htm"&gt;正则表达式测试器&lt;/a&gt;&#xD;
。请参考该页面的说明来安装和运行该软件。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;下面是Regex Tester运行时的截图：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://deerchao.net/tools/regex_tester/index.htm"&gt;&#xD;
&lt;img src="http://images.cnblogs.com/regex_tester.png" alt="正则表达式测试器运行截图" /&gt;&#xD;
&lt;/a&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;h2 id="metacode"&gt;元字符&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;现在你已经知道几个很有用的元字符了，如&#xD;
&lt;span &gt;\b&lt;/span&gt;&#xD;
,&#xD;
&lt;span &gt;.&lt;/span&gt;&#xD;
,&#xD;
&lt;span &gt;*&lt;/span&gt;&#xD;
，还有&#xD;
&lt;span &gt;\d&lt;/span&gt;&#xD;
.正则表达式里还有更多的元字符，比如&#xD;
&lt;span &gt;\s&lt;/span&gt;&#xD;
匹配&#xD;
&lt;span &gt;任意的空白符，包括空格，制表符(Tab)，换行符，中文全角空格等&lt;/span&gt;&#xD;
。&#xD;
&lt;span &gt;\w&lt;/span&gt;&#xD;
匹配&#xD;
&lt;span &gt;字母或数字或下划线或汉字等&lt;/span&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;p &gt;对中文/汉字的特殊处理是由.Net提供的正则表达式引擎支持的，其它环境下的具体情况请查看相关文档。&lt;/p&gt;&#xD;
&lt;p&gt;下面来看看更多的例子：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;\ba\w*\b&lt;/span&gt;&#xD;
匹配&#xD;
&lt;span &gt;&#xD;
以字母&#xD;
&lt;span &gt;a&lt;/span&gt;&#xD;
开头的单词&amp;#8212;&amp;#8212;先是某个单词开始处(&#xD;
&lt;span &gt;\b&lt;/span&gt;&#xD;
)，然后是字母&#xD;
&lt;span &gt;a&lt;/span&gt;&#xD;
,然后是任意数量的字母或数字(&#xD;
&lt;span &gt;\w*&lt;/span&gt;&#xD;
)，最后是单词结束处(&#xD;
&lt;span &gt;\b&lt;/span&gt;&#xD;
)&#xD;
&lt;/span&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;p &gt;好吧，现在我们说说正则表达式里的单词是什么意思吧：就是不少于一个的连续的&#xD;
&lt;span &gt;\w&lt;/span&gt;&#xD;
。不错，这与学习英文时要背的成千上万个同名的东西的确关系不大 :)&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;\d+&lt;/span&gt;&#xD;
匹配&#xD;
&lt;span &gt;1个或更多连续的数字&lt;/span&gt;&#xD;
。这里的&#xD;
&lt;span &gt;+&lt;/span&gt;&#xD;
是和&#xD;
&lt;span &gt;*&lt;/span&gt;&#xD;
类似的元字符，不同的是&#xD;
&lt;span &gt;*&lt;/span&gt;&#xD;
匹配&#xD;
&lt;span &gt;重复任意次(可能是0次)&lt;/span&gt;&#xD;
，而&#xD;
&lt;span &gt;+&lt;/span&gt;&#xD;
则匹配&#xD;
&lt;span &gt;重复1次或更多次&lt;/span&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;\b\w{6}\b&lt;/span&gt;&#xD;
匹配&#xD;
&lt;span &gt;刚好6个字符的单词&lt;/span&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;table cellspacing="0"&gt;&#xD;
    &lt;caption&gt;表1.常用的元字符&lt;/caption&gt;&#xD;
    &lt;thead&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;th scope="col"&gt;代码&lt;/th&gt;&#xD;
            &lt;th scope="col"&gt;说明&lt;/th&gt;&#xD;
        &lt;/tr&gt;&#xD;
    &lt;/thead&gt;&#xD;
    &lt;tbody&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;.&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;匹配除换行符以外的任意字符&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;\w&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;匹配字母或数字或下划线或汉字&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;\s&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;匹配任意的空白符&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;\d&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;匹配数字&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;\b&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;匹配单词的开始或结束&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;^&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;匹配字符串的开始&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;$&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;匹配字符串的结束&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
    &lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p &gt;正则表达式引擎通常会提供一个&amp;#8220;测试指定的字符串是否匹配一个正则表达式&amp;#8221;的方法，如JavaScript里的RegExp.test()方法或.NET里的Regex.IsMatch()方法。这里的匹配是指是字符串里有没有符合表达式规则的部分。如果不使用&#xD;
&lt;span &gt;^&lt;/span&gt;&#xD;
和&#xD;
&lt;span &gt;$&lt;/span&gt;&#xD;
的话，对于&#xD;
&lt;span &gt;\d{5,12}&lt;/span&gt;&#xD;
而言，使用这样的方法就只能保证字符串里&#xD;
&lt;span &gt;包含5到12连续位数字&lt;/span&gt;&#xD;
，而不是整个字符串就是5到12位数字。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;元字符&#xD;
&lt;span &gt;^&lt;/span&gt;&#xD;
（和数字6在同一个键位上的符号）和&#xD;
&lt;span &gt;$&lt;/span&gt;&#xD;
都匹配一个位置，这和&#xD;
&lt;span &gt;\b&lt;/span&gt;&#xD;
有点类似。&#xD;
&lt;span &gt;^&lt;/span&gt;&#xD;
匹配你要用来查找的字符串的开头，&#xD;
&lt;span &gt;$&lt;/span&gt;&#xD;
匹配结尾。这两个代码在验证输入的内容时非常有用，比如一个网站如果要求你填写的QQ号必须为5位到12位数字时，可以使用：&#xD;
&lt;span &gt;^\d{5,12}$&lt;/span&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;这里的&#xD;
&lt;span &gt;{5,12}&lt;/span&gt;&#xD;
和前面介绍过的&#xD;
&lt;span &gt;{2}&lt;/span&gt;&#xD;
是类似的，只不过&#xD;
&lt;span &gt;{2}&lt;/span&gt;&#xD;
匹配&#xD;
&lt;span &gt;只能不多不少重复2次&lt;/span&gt;&#xD;
，&#xD;
&lt;span &gt;{5,12}&lt;/span&gt;&#xD;
则是&#xD;
&lt;span &gt;重复的次数不能少于5次，不能多于12次&lt;/span&gt;&#xD;
，否则都不匹配。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;因为使用了&#xD;
&lt;span &gt;^&lt;/span&gt;&#xD;
和&#xD;
&lt;span &gt;$&lt;/span&gt;&#xD;
，所以输入的整个字符串都要用来和&#xD;
&lt;span &gt;\d{5,12}&lt;/span&gt;&#xD;
来匹配，也就是说整个输入&#xD;
&lt;span &gt;必须是5到12个数字&lt;/span&gt;&#xD;
，因此如果输入的QQ号能匹配这个正则表达式的话，那就符合要求了。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;和忽略大小写的选项类似，有些正则表达式处理工具还有一个处理多行的选项。如果选中了这个选项，&#xD;
&lt;span &gt;^&lt;/span&gt;&#xD;
和&#xD;
&lt;span &gt;$&lt;/span&gt;&#xD;
的意义就变成了&#xD;
&lt;span &gt;匹配行的开始处和结束处&lt;/span&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;h2 id="escape"&gt;字符转义&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果你想查找元字符本身的话，比如你查找&#xD;
&lt;span &gt;.&lt;/span&gt;&#xD;
,或者&#xD;
&lt;span &gt;*&lt;/span&gt;&#xD;
,就出现了问题：你没办法指定它们，因为它们会被解释成别的意思。这时你就得使用&#xD;
&lt;span &gt;\&lt;/span&gt;&#xD;
来取消这些字符的特殊意义。因此，你应该使用&#xD;
&lt;span &gt;\.&lt;/span&gt;&#xD;
和&#xD;
&lt;span &gt;\*&lt;/span&gt;&#xD;
。当然，要查找&#xD;
&lt;span &gt;\&lt;/span&gt;&#xD;
本身，你也得用&#xD;
&lt;span &gt;\\&lt;/span&gt;&#xD;
.&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;例如：&#xD;
&lt;span &gt;deerchao\.net&lt;/span&gt;&#xD;
匹配&#xD;
&lt;span &gt;deerchao.net&lt;/span&gt;&#xD;
，&#xD;
&lt;span &gt;C:\\Windows&lt;/span&gt;&#xD;
匹配&#xD;
&lt;span &gt;C:\Windows&lt;/span&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;h2 id="repeat"&gt;重复&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div id="ad1"&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;你已经看过了前面的&#xD;
&lt;span &gt;*&lt;/span&gt;&#xD;
,&#xD;
&lt;span &gt;+&lt;/span&gt;&#xD;
,&#xD;
&lt;span &gt;{2}&lt;/span&gt;&#xD;
,&#xD;
&lt;span &gt;{5,12}&lt;/span&gt;&#xD;
这几个匹配重复的方式了。下面是正则表达式中所有的限定符(指定数量的代码，例如*,{5,12}等)：&#xD;
&lt;/p&gt;&#xD;
&lt;table cellspacing="0"&gt;&#xD;
    &lt;caption&gt;表2.常用的限定符&lt;/caption&gt;&#xD;
    &lt;thead&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;th scope="col"&gt;代码/语法&lt;/th&gt;&#xD;
            &lt;th scope="col"&gt;说明&lt;/th&gt;&#xD;
        &lt;/tr&gt;&#xD;
    &lt;/thead&gt;&#xD;
    &lt;tbody&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;*&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;重复零次或更多次&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;+&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;重复一次或更多次&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;?&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;重复零次或一次&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;{n}&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;重复n次&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;{n,}&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;重复n次或更多次&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;{n,m}&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;重复n到m次&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
    &lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;下面是一些使用重复的例子：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;Windows\d+&lt;/span&gt;&#xD;
匹配&#xD;
&lt;span &gt;Windows后面跟1个或更多数字&lt;/span&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;^\w+&lt;/span&gt;&#xD;
匹配&#xD;
&lt;span &gt;一行的第一个单词(或整个字符串的第一个单词，具体匹配哪个意思得看选项设置)&lt;/span&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;h2 id="charclass"&gt;字符类&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;要想查找数字，字母或数字，空白是很简单的，因为已经有了对应这些字符集合的元字符，但是如果你想匹配没有预定义元字符的字符集合(比如元音字母a,e,i,o,u),应该怎么办？&lt;/p&gt;&#xD;
&lt;p&gt;很简单，你只需要在方括号里列出它们就行了，像&#xD;
&lt;span &gt;[aeiou]&lt;/span&gt;&#xD;
就匹配&#xD;
&lt;span &gt;任何一个英文元音字母&lt;/span&gt;&#xD;
，&#xD;
&lt;span &gt;[.?!]&lt;/span&gt;&#xD;
匹配&#xD;
&lt;span &gt;标点符号(.或?或!)&lt;/span&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;我们也可以轻松地指定一个字符&#xD;
&lt;span &gt;范围&lt;/span&gt;&#xD;
，像&#xD;
&lt;span &gt;[0-9]&lt;/span&gt;&#xD;
代表的含意与&#xD;
&lt;span &gt;\d&lt;/span&gt;&#xD;
就是完全一致的：&#xD;
&lt;span &gt;一位数字&lt;/span&gt;&#xD;
；同理&#xD;
&lt;span &gt;[a-z0-9A-Z_]&lt;/span&gt;&#xD;
也完全等同于&#xD;
&lt;span &gt;\w&lt;/span&gt;&#xD;
（如果只考虑英文的话）。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;下面是一个更复杂的表达式：&#xD;
&lt;span &gt;\(?0\d{2}[) -]?\d{8}&lt;/span&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;p &gt;&amp;#8220;(&amp;#8221;和&amp;#8220;)&amp;#8221;也是元字符，后面的&#xD;
&lt;a href="http://www.cnblogs.com/1971ruru/admin/EditPosts.aspx?opt=1#grouping"&gt;分组节&lt;/a&gt;&#xD;
里会提到，所以在这里需要使用&#xD;
&lt;a href="http://www.cnblogs.com/1971ruru/admin/EditPosts.aspx?opt=1#escape"&gt;转义&lt;/a&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;这个表达式可以匹配&#xD;
&lt;span &gt;几种格式的电话号码&lt;/span&gt;&#xD;
，像&#xD;
&lt;span &gt;(010)88886666&lt;/span&gt;&#xD;
，或&#xD;
&lt;span &gt;022-22334455&lt;/span&gt;&#xD;
，或&#xD;
&lt;span &gt;02912345678&lt;/span&gt;&#xD;
等。我们对它进行一些分析吧：首先是一个转义字符&#xD;
&lt;span &gt;\(&lt;/span&gt;&#xD;
,它能出现0次或1次(&#xD;
&lt;span &gt;?&lt;/span&gt;&#xD;
),然后是一个&#xD;
&lt;span &gt;0&lt;/span&gt;&#xD;
，后面跟着2个数字(&#xD;
&lt;span &gt;\d{2}&lt;/span&gt;&#xD;
)，然后是&#xD;
&lt;span &gt;)&lt;/span&gt;&#xD;
或&#xD;
&lt;span &gt;-&lt;/span&gt;&#xD;
或&#xD;
&lt;span &gt;空格&lt;/span&gt;&#xD;
中的一个，它出现1次或不出现(&#xD;
&lt;span &gt;?&lt;/span&gt;&#xD;
)，最后是8个数字(&#xD;
&lt;span &gt;\d{8}&lt;/span&gt;&#xD;
)。&#xD;
&lt;/p&gt;&#xD;
&lt;h2 id="alternative"&gt;分枝条件&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;不幸的是，刚才那个表达式也能匹配&#xD;
&lt;span &gt;010)12345678&lt;/span&gt;&#xD;
或&#xD;
&lt;span &gt;(022-87654321&lt;/span&gt;&#xD;
这样的&amp;#8220;不正确&amp;#8221;的格式。要解决这个问题，我们需要用到&#xD;
&lt;span &gt;分枝条件&lt;/span&gt;&#xD;
。正则表达式里的&#xD;
&lt;span &gt;分枝条件&lt;/span&gt;&#xD;
指的是有几种规则，如果满足其中任意一种规则都应该当成匹配，具体方法是用&#xD;
&lt;span &gt;|&lt;/span&gt;&#xD;
把不同的规则分隔开。听不明白？没关系，看例子：&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;0\d{2}-\d{8}|0\d{3}-\d{7}&lt;/span&gt;&#xD;
这个表达式能&#xD;
&lt;span &gt;匹配两种以连字号分隔的电话号码：一种是三位区号，8位本地号(如010-12345678)，一种是4位区号，7位本地号(0376-2233445)&lt;/span&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;\(?0\d{2}\)?[- ]?\d{8}|0\d{2}[- ]?\d{8}&lt;/span&gt;&#xD;
这个表达式&#xD;
&lt;span &gt;匹配3位区号的电话号码，其中区号可以用小括号括起来，也可以不用，区号与本地号间可以用连字号或空格间隔，也可以没有间隔&lt;/span&gt;&#xD;
。你可以试试用分枝条件把这个表达式扩展成也支持4位区号的。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;\d{5}-\d{4}|\d{5}&lt;/span&gt;&#xD;
这个表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字，或者用连字号间隔的9位数字。之所以要给出这个例子是因为它能说明一个问题：&#xD;
&lt;strong&gt;使用分枝条件时，要注意各个条件的顺序&lt;/strong&gt;&#xD;
。如果你把它改成&#xD;
&lt;span &gt;\d{5}|\d{5}-\d{4}&lt;/span&gt;&#xD;
的话，那么就只会匹配5位的邮编(以及9位邮编的前5位)。原因是匹配分枝条件时，将会从左到右地测试每个条件，如果满足了某个分枝的话，就不会去再管其它的条件了。&#xD;
&lt;/p&gt;&#xD;
&lt;h2 id="grouping"&gt;分组&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我们已经提到了怎么重复单个字符（直接在字符后面加上限定符就行了）；但如果想要重复多个字符又该怎么办？你可以用小括号来指定&#xD;
&lt;span &gt;子表达式&lt;/span&gt;&#xD;
(也叫做&#xD;
&lt;span &gt;分组&lt;/span&gt;&#xD;
)，然后你就可以指定这个子表达式的重复次数了，你也可以对子表达式进行其它一些操作(后面会有介绍)。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;(\d{1,3}\.){3}\d{1,3}&lt;/span&gt;&#xD;
是一个&#xD;
&lt;span &gt;简单的IP地址匹配&lt;/span&gt;&#xD;
表达式。要理解这个表达式，请按下列顺序分析它：&#xD;
&lt;span &gt;\d{1,3}&lt;/span&gt;&#xD;
匹配&#xD;
&lt;span &gt;1到3位的数字&lt;/span&gt;&#xD;
，&#xD;
&lt;span &gt;(\d{1,3}\.){3}&lt;/span&gt;&#xD;
匹配&#xD;
&lt;span &gt;&#xD;
三位数字加上一个英文句号(这个整体也就是这个&#xD;
&lt;span &gt;分组&lt;/span&gt;&#xD;
)重复3次&#xD;
&lt;/span&gt;&#xD;
，最后再加上&#xD;
&lt;span &gt;一个一到三位的数字&lt;/span&gt;&#xD;
(&#xD;
&lt;span &gt;\d{1,3}&lt;/span&gt;&#xD;
)。&#xD;
&lt;/p&gt;&#xD;
&lt;p &gt;IP地址中每个数字都不能大于255，大家千万不要被《24》第三季的编剧给忽悠了&amp;#8230;&amp;#8230;&lt;/p&gt;&#xD;
&lt;p&gt;不幸的是，它也将匹配&#xD;
&lt;span &gt;256.300.888.999&lt;/span&gt;&#xD;
这种不可能存在的IP地址。如果能使用算术比较的话，或许能简单地解决这个问题，但是正则表达式中并不提供关于数学的任何功能，所以只能使用冗长的分组，选择，字符类来描述一个正确的IP地址：&#xD;
&lt;span &gt;((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)&lt;/span&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;理解这个表达式的关键是理解&#xD;
&lt;span &gt;2[0-4]\d|25[0-5]|[01]?\d\d?&lt;/span&gt;&#xD;
，这里我就不细说了，你自己应该能分析得出来它的意义。&#xD;
&lt;/p&gt;&#xD;
&lt;h2 id="negation"&gt;反义&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外，其它任意字符都行的情况，这时需要用到&#xD;
&lt;span &gt;反义&lt;/span&gt;&#xD;
：&#xD;
&lt;/p&gt;&#xD;
&lt;table cellspacing="0"&gt;&#xD;
    &lt;caption&gt;表3.常用的反义代码&lt;/caption&gt;&#xD;
    &lt;thead&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;th scope="col"&gt;代码/语法&lt;/th&gt;&#xD;
            &lt;th scope="col"&gt;说明&lt;/th&gt;&#xD;
        &lt;/tr&gt;&#xD;
    &lt;/thead&gt;&#xD;
    &lt;tbody&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;\W&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;匹配任意不是字母，数字，下划线，汉字的字符&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;\S&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;匹配任意不是空白符的字符&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;\D&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;匹配任意非数字的字符&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;\B&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;匹配不是单词开头或结束的位置&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;[^x]&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;匹配除了x以外的任意字符&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;[^aeiou]&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;匹配除了aeiou这几个字母以外的任意字符&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
    &lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;例子：&#xD;
&lt;span &gt;\S+&lt;/span&gt;&#xD;
匹配&#xD;
&lt;span &gt;不包含空白符的字符串&lt;/span&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&amp;lt;a[^&amp;gt;]+&amp;gt;&lt;/span&gt;&#xD;
匹配&#xD;
&lt;span &gt;用尖括号括起来的以a开头的字符串&lt;/span&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;h2 id="backreference"&gt;后向引用&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;使用小括号指定一个子表达式后，&#xD;
&lt;strong&gt;匹配这个子表达式的文本&lt;/strong&gt;&#xD;
(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下，每个分组会自动拥有一个&#xD;
&lt;span &gt;组号&lt;/span&gt;&#xD;
，规则是：从左向右，以分组的左括号为标志，第一个出现的分组的组号为1，第二个为2，以此类推。&#xD;
&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;呃&amp;#8230;&amp;#8230;其实,组号分配还不像我刚说得那么简单：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
    &lt;li&gt;分组0对应整个正则表达式&lt;/li&gt;&#xD;
    &lt;li&gt;实际上组号分配过程是要从左向右扫描两遍的：第一遍只给未命名组分配，第二遍只给命名组分配－－因此所有命名组的组号都大于未命名的组号&lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    你可以使用&#xD;
    &lt;span &gt;(?:exp)&lt;/span&gt;&#xD;
    这样的语法来剥夺一个分组对组号分配的参与权．&#xD;
    &lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span &gt;后向引用&lt;/span&gt;&#xD;
用于重复搜索前面某个分组匹配的文本。例如，&#xD;
&lt;span &gt;\1&lt;/span&gt;&#xD;
代表&#xD;
&lt;span &gt;分组1匹配的文本&lt;/span&gt;&#xD;
。难以理解？请看示例：&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;\b(\w+)\b\s+\1\b&lt;/span&gt;&#xD;
可以用来匹配&#xD;
&lt;span &gt;重复的单词&lt;/span&gt;&#xD;
，像&#xD;
&lt;span &gt;go go&lt;/span&gt;&#xD;
, 或者&#xD;
&lt;span &gt;kitty kitty&lt;/span&gt;&#xD;
。这个表达式首先是&#xD;
&lt;span &gt;一个单词&lt;/span&gt;&#xD;
，也就是&#xD;
&lt;span &gt;单词开始处和结束处之间的多于一个的字母或数字&lt;/span&gt;&#xD;
(&#xD;
&lt;span &gt;\b(\w+)\b&lt;/span&gt;&#xD;
)，这个单词会被捕获到编号为1的分组中，然后是&#xD;
&lt;span &gt;1个或几个空白符&lt;/span&gt;&#xD;
(&#xD;
&lt;span &gt;\s+&lt;/span&gt;&#xD;
)，最后是&#xD;
&lt;span &gt;分组1中捕获的内容（也就是前面匹配的那个单词）&lt;/span&gt;&#xD;
(&#xD;
&lt;span &gt;\1&lt;/span&gt;&#xD;
)。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;你也可以自己指定子表达式的&#xD;
&lt;span &gt;组名&lt;/span&gt;&#xD;
。要指定一个子表达式的组名，请使用这样的语法：&#xD;
&lt;span &gt;(?&amp;lt;Word&amp;gt;\w+)&lt;/span&gt;&#xD;
(或者把尖括号换成&#xD;
&lt;span &gt;'&lt;/span&gt;&#xD;
也行：&#xD;
&lt;span &gt;(?'Word'\w+)&lt;/span&gt;&#xD;
),这样就把&#xD;
&lt;span &gt;\w+&lt;/span&gt;&#xD;
的组名指定为&#xD;
&lt;span &gt;Word&lt;/span&gt;&#xD;
了。要反向引用这个分组&#xD;
&lt;span &gt;捕获&lt;/span&gt;&#xD;
的内容，你可以使用&#xD;
&lt;span &gt;\k&amp;lt;Word&amp;gt;&lt;/span&gt;&#xD;
,所以上一个例子也可以写成这样：&#xD;
&lt;span &gt;\b(?&amp;lt;Word&amp;gt;\w+)\b\s+\k&amp;lt;Word&amp;gt;\b&lt;/span&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;使用小括号的时候，还有很多特定用途的语法。下面列出了最常用的一些：&lt;/p&gt;&#xD;
&lt;table cellspacing="0"&gt;&#xD;
    &lt;caption&gt;表4.常用分组语法&lt;/caption&gt;&#xD;
    &lt;tbody&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;th scope="col"&gt;分类&lt;/th&gt;&#xD;
            &lt;th scope="col"&gt;代码/语法&lt;/th&gt;&#xD;
            &lt;th scope="col"&gt;说明&lt;/th&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;th rowspan="3"&gt;捕获&lt;/th&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;(exp)&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;匹配exp,并捕获文本到自动命名的组里&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;(?&amp;lt;name&amp;gt;exp)&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;匹配exp,并捕获文本到名称为name的组里，也可以写成(?'name'exp)&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;(?:exp)&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;匹配exp,不捕获匹配的文本，也不给此分组分配组号&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;th rowspan="4"&gt;零宽断言&lt;/th&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;(?=exp)&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;匹配exp前面的位置&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;(?&amp;lt;=exp)&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;匹配exp后面的位置&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;(?!exp)&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;匹配后面跟的不是exp的位置&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;(?&amp;lt;!exp)&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;匹配前面不是exp的位置&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;th rowspan="1"&gt;注释&lt;/th&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;(?#comment)&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;这种类型的分组不对正则表达式的处理产生任何影响，用于提供注释让人阅读&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
    &lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;我们已经讨论了前两种语法。第三个&#xD;
&lt;span &gt;(?:exp)&lt;/span&gt;&#xD;
不会改变正则表达式的处理方式，只是这样的组匹配的内容&#xD;
&lt;span &gt;不会像前两种那样被捕获到某个组里面，也不会拥有组号&lt;/span&gt;&#xD;
。&amp;#8220;我为什么会想要这样做？&amp;#8221;&amp;#8212;&amp;#8212;好问题，你觉得为什么呢？&#xD;
&lt;/p&gt;&#xD;
&lt;h2 id="lookaround"&gt;零宽断言&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p &gt;地球人，是不是觉得这些术语名称太复杂，太难记了？我也有同感。知道有这么一种东西就行了，它叫什么，随它去吧！人若无名，便可专心练剑；物若无名，便可随意取舍&amp;#8230;&amp;#8230;&lt;/p&gt;&#xD;
&lt;p&gt;接下来的四个用于查找在某些内容(但并不包括这些内容)之前或之后的东西，也就是说它们像&#xD;
&lt;span &gt;\b&lt;/span&gt;&#xD;
,&#xD;
&lt;span &gt;^&lt;/span&gt;&#xD;
,&#xD;
&lt;span &gt;$&lt;/span&gt;&#xD;
那样用于指定一个位置，这个位置应该满足一定的条件(即断言)，因此它们也被称为&#xD;
&lt;span &gt;零宽断言&lt;/span&gt;&#xD;
。最好还是拿例子来说明吧：&#xD;
&lt;/p&gt;&#xD;
&lt;p &gt;断言用来声明一个应该为真的事实。正则表达式中只有当断言为真时才会继续进行匹配。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;(?=exp)&lt;/span&gt;&#xD;
也叫&#xD;
&lt;span &gt;零宽度正预测先行断言&lt;/span&gt;&#xD;
，它&#xD;
&lt;span &gt;断言自身出现的位置的后面能匹配表达式exp&lt;/span&gt;&#xD;
。比如&#xD;
&lt;span &gt;\b\w+(?=ing\b)&lt;/span&gt;&#xD;
，匹配&#xD;
&lt;span &gt;以ing结尾的单词的前面部分(除了ing以外的部分)&lt;/span&gt;&#xD;
，如查找&#xD;
&lt;span &gt;I'm singing while you're dancing.&lt;/span&gt;&#xD;
时，它会匹配&#xD;
&lt;span &gt;sing&lt;/span&gt;&#xD;
和&#xD;
&lt;span &gt;danc&lt;/span&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;(?&amp;lt;=exp)&lt;/span&gt;&#xD;
也叫&#xD;
&lt;span &gt;零宽度正回顾后发断言&lt;/span&gt;&#xD;
，它&#xD;
&lt;span &gt;断言自身出现的位置的前面能匹配表达式exp&lt;/span&gt;&#xD;
。比如&#xD;
&lt;span &gt;(?&amp;lt;=\bre)\w+\b&lt;/span&gt;&#xD;
会匹配&#xD;
&lt;span &gt;以re开头的单词的后半部分(除了re以外的部分)&lt;/span&gt;&#xD;
，例如在查找&#xD;
&lt;span &gt;reading a book&lt;/span&gt;&#xD;
时，它匹配&#xD;
&lt;span &gt;ading&lt;/span&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了)，你可以这样查找需要在前面和里面添加逗号的部分：&#xD;
&lt;span &gt;((?&amp;lt;=\d)\d{3})+\b&lt;/span&gt;&#xD;
，用它对&#xD;
&lt;span &gt;1234567890&lt;/span&gt;&#xD;
进行查找时结果是&#xD;
&lt;span &gt;234567890&lt;/span&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;下面这个例子同时使用了这两种断言：&#xD;
&lt;span &gt;(?&amp;lt;=\s)\d+(?=\s)&lt;/span&gt;&#xD;
匹配&#xD;
&lt;span &gt;以空白符间隔的数字(再次强调，不包括这些空白符)&lt;/span&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;h2 id="negativelookaround"&gt;负向零宽断言&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;前面我们提到过怎么查找&#xD;
&lt;strong&gt;不是某个字符或不在某个字符类里&lt;/strong&gt;&#xD;
的字符的方法(反义)。但是如果我们只是想要&#xD;
&lt;strong&gt;确保某个字符没有出现，但并不想去匹配它&lt;/strong&gt;&#xD;
时怎么办？例如，如果我们想查找这样的单词--它里面出现了字母q,但是q后面跟的不是字母u,我们可以尝试这样：&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;\b\w*q[^u]\w*\b&lt;/span&gt;&#xD;
匹配&#xD;
&lt;span &gt;&#xD;
包含&#xD;
&lt;strong&gt;后面不是字母u的字母q&lt;/strong&gt;&#xD;
的单词&#xD;
&lt;/span&gt;&#xD;
。但是如果多做测试(或者你思维足够敏锐，直接就观察出来了)，你会发现，如果q出现在单词的结尾的话，像&#xD;
&lt;strong&gt;Iraq&lt;/strong&gt;&#xD;
,&#xD;
&lt;strong&gt;Benq&lt;/strong&gt;&#xD;
，这个表达式就会出错。这是因为&#xD;
&lt;span &gt;[^u]&lt;/span&gt;&#xD;
总要匹配一个字符，所以如果q是单词的最后一个字符的话，后面的&#xD;
&lt;span &gt;[^u]&lt;/span&gt;&#xD;
将会匹配q后面的单词分隔符(可能是空格，或者是句号或其它的什么)，后面的&#xD;
&lt;span &gt;\w*\b&lt;/span&gt;&#xD;
将会匹配下一个单词，于是&#xD;
&lt;span &gt;\b\w*q[^u]\w*\b&lt;/span&gt;&#xD;
就能匹配整个&#xD;
&lt;span &gt;Iraq fighting&lt;/span&gt;&#xD;
。&#xD;
&lt;span &gt;负向零宽断言&lt;/span&gt;&#xD;
能解决这样的问题，因为它只匹配一个位置，并不&#xD;
&lt;strong&gt;消费&lt;/strong&gt;&#xD;
任何字符。现在，我们可以这样来解决这个问题：&#xD;
&lt;span &gt;\b\w*q(?!u)\w*\b&lt;/span&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;零宽度负预测先行断言&lt;/span&gt;&#xD;
&lt;span &gt;(?!exp)&lt;/span&gt;&#xD;
，&#xD;
&lt;span &gt;断言此位置的后面不能匹配表达式exp&lt;/span&gt;&#xD;
。例如：&#xD;
&lt;span &gt;\d{3}(?!\d)&lt;/span&gt;&#xD;
匹配&#xD;
&lt;span &gt;三位数字，而且这三位数字的后面不能是数字&lt;/span&gt;&#xD;
；&#xD;
&lt;span &gt;\b((?!abc)\w)+\b&lt;/span&gt;&#xD;
匹配&#xD;
&lt;span &gt;不包含连续字符串abc的单词&lt;/span&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;同理，我们可以用&#xD;
&lt;span &gt;(?&amp;lt;!exp)&lt;/span&gt;&#xD;
,&#xD;
&lt;span &gt;零宽度负回顾后发断言&lt;/span&gt;&#xD;
来&#xD;
&lt;span &gt;断言此位置的前面不能匹配表达式exp&lt;/span&gt;&#xD;
：&#xD;
&lt;span &gt;(?&amp;lt;![a-z])\d{7}&lt;/span&gt;&#xD;
匹配&#xD;
&lt;span &gt;前面不是小写字母的七位数字&lt;/span&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;p &gt;请详细分析表达式&#xD;
&lt;span &gt;(?&amp;lt;=&amp;lt;(\w+)&amp;gt;).*(?=&amp;lt;\/\1&amp;gt;)&lt;/span&gt;&#xD;
，这个表达式最能表现零宽断言的真正用途。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;一个更复杂的例子：&#xD;
&lt;span &gt;(?&amp;lt;=&amp;lt;(\w+)&amp;gt;).*(?=&amp;lt;\/\1&amp;gt;)&lt;/span&gt;&#xD;
匹配&#xD;
&lt;span &gt;不包含属性的简单HTML标签内里的内容&lt;/span&gt;&#xD;
。&#xD;
&lt;span &gt;(?&amp;lt;=&amp;lt;(\w+)&amp;gt;)&lt;/span&gt;&#xD;
指定了这样的&#xD;
&lt;span &gt;前缀&lt;/span&gt;&#xD;
：&#xD;
&lt;span &gt;被尖括号括起来的单词&lt;/span&gt;&#xD;
(比如可能是&amp;lt;b&amp;gt;)，然后是&#xD;
&lt;span &gt;.*&lt;/span&gt;&#xD;
(任意的字符串),最后是一个&#xD;
&lt;span &gt;后缀&lt;/span&gt;&#xD;
&lt;span &gt;(?=&amp;lt;\/\1&amp;gt;)&lt;/span&gt;&#xD;
。注意后缀里的&#xD;
&lt;span &gt;\/&lt;/span&gt;&#xD;
，它用到了前面提过的字符转义；&#xD;
&lt;span &gt;\1&lt;/span&gt;&#xD;
则是一个反向引用，引用的正是&#xD;
&lt;span &gt;捕获的第一组&lt;/span&gt;&#xD;
，前面的&#xD;
&lt;span &gt;(\w+)&lt;/span&gt;&#xD;
匹配的内容，这样如果前缀实际上是&amp;lt;b&amp;gt;的话，后缀就是&amp;lt;/b&amp;gt;了。整个表达式匹配的是&amp;lt;b&amp;gt;和&amp;lt;/b&amp;gt;之间的内容(再次提醒，不包括前缀和后缀本身)。&#xD;
&lt;/p&gt;&#xD;
&lt;h2 id="commenting"&gt;注释&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;小括号的另一种用途是通过语法&#xD;
&lt;span &gt;(?#comment)&lt;/span&gt;&#xD;
来包含注释。例如：&#xD;
&lt;span &gt;2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)&lt;/span&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;要包含注释的话，最好是启用&amp;#8220;忽略模式里的空白符&amp;#8221;选项，这样在编写表达式时能任意的添加空格，Tab，换行，而实际使用时这些都将被忽略。启用这个选项后，在#后面到这一行结束的所有文本都将被当成注释忽略掉。例如，我们可以前面的一个表达式写成这样：&lt;/p&gt;&#xD;
&lt;pre &gt;(?&amp;lt;=    # 断言要匹配的文本的前缀&#xD;
&amp;lt;(\w+)&amp;gt; # 查找尖括号括起来的字母或数字(即HTML/XML标签)&#xD;
)       # 前缀结束&#xD;
.*      # 匹配任意文本&#xD;
(?=     # 断言要匹配的文本的后缀&#xD;
&amp;lt;\/\1&amp;gt;  # 查找尖括号括起来的内容：前面是一个"/"，后面是先前捕获的标签&#xD;
)       # 后缀结束&lt;/pre&gt;&#xD;
&lt;h2 id="greedyandlazy"&gt;贪婪与懒惰&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;当正则表达式中包含能接受重复的限定符时，通常的行为是（在使整个表达式能得到匹配的前提下）匹配&#xD;
&lt;strong&gt;尽可能多&lt;/strong&gt;&#xD;
的字符。以这个表达式为例：&#xD;
&lt;span &gt;a.*b&lt;/span&gt;&#xD;
，它将会匹配&#xD;
&lt;span &gt;最长的以a开始，以b结束的字符串&lt;/span&gt;&#xD;
。如果用它来搜索&#xD;
&lt;span &gt;aabab&lt;/span&gt;&#xD;
的话，它会匹配整个字符串&#xD;
&lt;span &gt;aabab&lt;/span&gt;&#xD;
。这被称为&#xD;
&lt;span &gt;贪婪&lt;/span&gt;&#xD;
匹配。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;有时，我们更需要&#xD;
&lt;span &gt;懒惰&lt;/span&gt;&#xD;
匹配，也就是匹配&#xD;
&lt;strong&gt;尽可能少&lt;/strong&gt;&#xD;
的字符。前面给出的限定符都可以被转化为懒惰匹配模式，只要在它后面加上一个问号&#xD;
&lt;span &gt;?&lt;/span&gt;&#xD;
。这样&#xD;
&lt;span &gt;.*?&lt;/span&gt;&#xD;
就意味着&#xD;
&lt;span &gt;匹配任意数量的重复，但是在能使整个匹配成功的前提下使用最少的重复&lt;/span&gt;&#xD;
。现在看看懒惰版的例子吧：&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;a.*?b&lt;/span&gt;&#xD;
匹配&#xD;
&lt;span &gt;最短的，以a开始，以b结束的字符串&lt;/span&gt;&#xD;
。如果把它应用于&#xD;
&lt;span &gt;aabab&lt;/span&gt;&#xD;
的话，它会匹配&#xD;
&lt;span &gt;aab（第一到第三个字符）&lt;/span&gt;&#xD;
和&#xD;
&lt;span &gt;ab（第四到第五个字符）&lt;/span&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;p &gt;为什么第一个匹配是aab（第一到第三个字符）而不是ab（第二到第三个字符）？简单地说，因为正则表达式有另一条规则，比懒惰／贪婪规则的优先级更高：最先开始的匹配拥有最高的优先权&amp;#8212;&amp;#8212;The match that begins earliest wins。&lt;/p&gt;&#xD;
&lt;table cellspacing="0"&gt;&#xD;
    &lt;caption&gt;表5.懒惰限定符&lt;/caption&gt;&#xD;
    &lt;thead&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;th scope="col"&gt;代码/语法&lt;/th&gt;&#xD;
            &lt;th scope="col"&gt;说明&lt;/th&gt;&#xD;
        &lt;/tr&gt;&#xD;
    &lt;/thead&gt;&#xD;
    &lt;tbody&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;*?&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;重复任意次，但尽可能少重复&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;+?&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;重复1次或更多次，但尽可能少重复&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;??&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;重复0次或1次，但尽可能少重复&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;{n,m}?&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;重复n到m次，但尽可能少重复&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;{n,}?&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;重复n次以上，但尽可能少重复&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
    &lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;h2 id="regexoptions"&gt;处理选项&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p &gt;在C#中，你可以使用&#xD;
&lt;a href="http://msdn2.microsoft.com/zh-cn/library/h5845fdz.aspx" title="MSDN 相关文档"&gt;Regex(String, RegexOptions)构造函数&lt;/a&gt;&#xD;
来设置正则表达式的处理选项。如：Regex regex = new Regex(@"\ba\w{6}\b", RegexOptions.IgnoreCase);&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;上面介绍了几个选项如忽略大小写，处理多行等，这些选项能用来改变处理正则表达式的方式。下面是.Net中常用的正则表达式选项：&lt;/p&gt;&#xD;
&lt;table cellspacing="0"&gt;&#xD;
    &lt;caption&gt;表6.常用的处理选项&lt;/caption&gt;&#xD;
    &lt;thead&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;th scope="col"&gt;名称&lt;/th&gt;&#xD;
            &lt;th scope="col"&gt;说明&lt;/th&gt;&#xD;
        &lt;/tr&gt;&#xD;
    &lt;/thead&gt;&#xD;
    &lt;tbody&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;IgnoreCase(忽略大小写)&lt;/td&gt;&#xD;
            &lt;td&gt;匹配时不区分大小写。&lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;Multiline(多行模式)&lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            更改&#xD;
            &lt;span &gt;^&lt;/span&gt;&#xD;
            和&#xD;
            &lt;span &gt;$&lt;/span&gt;&#xD;
            的含义，使它们分别在任意一行的行首和行尾匹配，而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,&#xD;
            &lt;span &gt;$&lt;/span&gt;&#xD;
            的精确含意是:匹配\n之前的位置以及字符串结束前的位置.)&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;Singleline(单行模式)&lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            更改&#xD;
            &lt;span &gt;.&lt;/span&gt;&#xD;
            的含义，使它与每一个字符匹配（包括换行符\n）。&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;IgnorePatternWhitespace(忽略空白)&lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            忽略表达式中的非转义空白并启用由&#xD;
            &lt;span &gt;#&lt;/span&gt;&#xD;
            标记的注释。&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;ExplicitCapture(显式捕获)&lt;/td&gt;&#xD;
            &lt;td&gt;仅捕获已被显式命名的组。&lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
    &lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;一个经常被问到的问题是：是不是只能同时使用多行模式和单行模式中的一种？答案是：不是。这两个选项之间没有任何关系，除了它们的名字比较相似（以至于让人感到疑惑）以外。&lt;/p&gt;&#xD;
&lt;h2 id="balancedgroup"&gt;平衡组/递归匹配&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p &gt;这里介绍的平衡组语法是由.Net Framework支持的；其它语言／库不一定支持这种功能，或者支持此功能但需要使用不同的语法。&lt;/p&gt;&#xD;
&lt;p&gt;有时我们需要匹配像&#xD;
&lt;span &gt;( 100 * ( 50 + 15 ) )这样的可嵌套的层次性结构&lt;/span&gt;&#xD;
，这时简单地使用&#xD;
&lt;span &gt;\(.+\)&lt;/span&gt;&#xD;
则只会匹配到最左边的左括号和最右边的右括号之间的内容(这里我们讨论的是贪婪模式，懒惰模式也有下面的问题)。假如原来的字符串里的左括号和右括号出现的次数不相等，比如&#xD;
&lt;span &gt;( 5 / ( 3 + 2 ) ) )&lt;/span&gt;&#xD;
，那我们的匹配结果里两者的个数也不会相等。有没有办法在这样的字符串里匹配到最长的，配对的括号之间的内容呢？&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;为了避免&#xD;
&lt;span &gt;(&lt;/span&gt;&#xD;
和&#xD;
&lt;span &gt;\(&lt;/span&gt;&#xD;
把你的大脑彻底搞糊涂，我们还是用尖括号代替圆括号吧。现在我们的问题变成了如何把&#xD;
&lt;span &gt;xx &amp;lt;aa &amp;lt;bbb&amp;gt; &amp;lt;bbb&amp;gt; aa&amp;gt; yy&lt;/span&gt;&#xD;
这样的字符串里，最长的配对的尖括号内的内容捕获出来？&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;这里需要用到以下的语法构造：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;span &gt;(?'group')&lt;/span&gt;&#xD;
    把捕获的内容命名为group,并压入&#xD;
    &lt;span &gt;堆栈(Stack)&lt;/span&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;span &gt;(?'-group')&lt;/span&gt;&#xD;
    从堆栈上弹出最后压入堆栈的名为group的捕获内容，如果堆栈本来为空，则本分组的匹配失败&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;span &gt;(?(group)yes|no)&lt;/span&gt;&#xD;
    如果堆栈上存在以名为group的捕获内容的话，继续匹配yes部分的表达式，否则继续匹配no部分&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;span &gt;(?!)&lt;/span&gt;&#xD;
    零宽负向先行断言，由于没有后缀表达式，试图匹配总是失败&#xD;
    &lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p &gt;如果你不是一个程序员（或者你自称程序员但是不知道堆栈是什么东西），你就这样理解上面的三种语法吧：第一个就是在黑板上写一个"group"，第二个就是从黑板上擦掉一个"group"，第三个就是看黑板上写的还有没有"group"，如果有就继续匹配yes部分，否则就匹配no部分。&lt;/p&gt;&#xD;
&lt;p&gt;我们需要做的是每碰到了左括号，就在压入一个"Open",每碰到一个右括号，就弹出一个，到了最后就看看堆栈是否为空－－如果不为空那就证明左括号比右括号多，那匹配就应该失败。正则表达式引擎会进行回溯(放弃最前面或最后面的一些字符)，尽量使整个表达式得到匹配。&lt;/p&gt;&#xD;
&lt;pre &gt;&amp;lt;                         #最外层的左括号&#xD;
[^&amp;lt;&amp;gt;]*                #最外层的左括号后面的不是括号的内容&#xD;
(&#xD;
(&#xD;
(?'Open'&amp;lt;)    #碰到了左括号，在黑板上写一个"Open"&#xD;
[^&amp;lt;&amp;gt;]*       #匹配左括号后面的不是括号的内容&#xD;
)+&#xD;
(&#xD;
(?'-Open'&amp;gt;)   #碰到了右括号，擦掉一个"Open"&#xD;
[^&amp;lt;&amp;gt;]*        #匹配右括号后面不是括号的内容&#xD;
)+&#xD;
)*&#xD;
(?(Open)(?!))         #在遇到最外层的右括号前面，判断黑板上还有没有没擦掉的"Open"；如果还有，则匹配失败&#xD;
&amp;gt;                         #最外层的右括号&lt;/pre&gt;&#xD;
&lt;p&gt;平衡组的一个最常见的应用就是匹配HTML,下面这个例子可以匹配&#xD;
&lt;span &gt;嵌套的&amp;lt;div&amp;gt;标签&lt;/span&gt;&#xD;
：&#xD;
&lt;span &gt;&amp;lt;div[^&amp;gt;]*&amp;gt;[^&amp;lt;&amp;gt;]*(((?'Open'&amp;lt;div[^&amp;gt;]*&amp;gt;)[^&amp;lt;&amp;gt;]*)+((?'-Open'&amp;lt;/div&amp;gt;)[^&amp;lt;&amp;gt;]*)+)*(?(Open)(?!))&amp;lt;/div&amp;gt;&lt;/span&gt;&#xD;
.&#xD;
&lt;/p&gt;&#xD;
&lt;h2 id="more"&gt;还有些什么东西没提到&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;上边已经描述了构造正则表达式的大量元素，但是还有很多没有提到的东西。下面是一些未提到的元素的列表，包含语法和简单的说明。你可以在网上找到更详细的参考资料来学习它们--当你需要用到它们的时候。如果你安装了MSDN&#xD;
Library,你也可以在里面找到.net下正则表达式详细的文档。&lt;/p&gt;&#xD;
&lt;p &gt;这里的介绍很简略，如果你需要更详细的信息，而又没有在电脑上安装MSDN Library,可以查看&#xD;
&lt;a href="http://msdn.microsoft.com/zh-cn/library/az24scfc.aspx"&gt;关于正则表达式语言元素的MSDN在线文档&lt;/a&gt;&#xD;
。&#xD;
&lt;/p&gt;&#xD;
&lt;table cellspacing="0"&gt;&#xD;
    &lt;caption&gt;表7.尚未详细讨论的语法&lt;/caption&gt;&#xD;
    &lt;thead&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;th scope="col"&gt;代码/语法&lt;/th&gt;&#xD;
            &lt;th scope="col"&gt;说明&lt;/th&gt;&#xD;
        &lt;/tr&gt;&#xD;
    &lt;/thead&gt;&#xD;
    &lt;tbody&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;\a&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;报警字符(打印它的效果是电脑嘀一声)&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;\b&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;通常是单词分界位置，但如果在字符类里使用代表退格&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;\t&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;制表符，Tab&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;\r&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;回车&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;\v&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;竖向制表符&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;\f&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;换页符&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;\n&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;换行符&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;\e&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;Escape&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;\0nn&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;ASCII代码中八进制代码为nn的字符&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;\xnn&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;ASCII代码中十六进制代码为nn的字符&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;\unnnn&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;Unicode代码中十六进制代码为nnnn的字符&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;\cN&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;ASCII控制字符。比如\cC代表Ctrl+C&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;\A&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;字符串开头(类似^，但不受处理多行选项的影响)&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;\Z&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;字符串结尾或行尾(不受处理多行选项的影响)&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;\z&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;字符串结尾(类似$，但不受处理多行选项的影响)&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;\G&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;当前搜索的开头&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;\p{name}&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;Unicode中命名为name的字符类，例如\p{IsGreek}&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;(?&amp;gt;exp)&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;贪婪子表达式&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;(?&amp;lt;x&amp;gt;-&amp;lt;y&amp;gt;exp)&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;平衡组&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;(?im-nsx:exp)&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;在子表达式exp中改变处理选项&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;(?im-nsx)&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;为表达式后面的部分改变处理选项&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;(?(exp)yes|no)&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;把exp当作零宽正向先行断言，如果在这个位置能匹配，使用yes作为此组的表达式；否则使用no&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;(?(exp)yes)&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;同上，只是使用空表达式作为no&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;(?(name)yes|no)&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;如果命名为name的组捕获到了内容，使用yes作为表达式；否则使用no&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
        &lt;tr&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;(?(name)yes)&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
            &lt;td&gt;&#xD;
            &lt;span &gt;同上，只是使用空表达式作为no&lt;/span&gt;&#xD;
            &lt;/td&gt;&#xD;
        &lt;/tr&gt;&#xD;
    &lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;h2 id="contact"&gt;&amp;nbsp;&#xD;
&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;h2 id="resources"&gt;网上的资源及本文参考文献&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/jscript7/html/jsreconintroductiontoregularexpressions.asp"&gt;微软的正则表达式教程&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://msdn2.microsoft.com/zh-cn/library/system.text.regularexpressions.regex.aspx"&gt;System.Text.RegularExpressions.Regex类(MSDN)&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.regular-expressions.info/"&gt;专业的正则表达式教学网站(英文)&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://weblogs.asp.net/whaggard/archive/2005/02/20/377025.aspx"&gt;关于.Net下的平衡组的详细讨论（英文）&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.oreilly.com/catalog/regex2/"&gt;Mastering Regular Expressions (Second Edition)&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;h2 id="updatelog"&gt;&amp;nbsp;&#xD;
&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;img src="http://www.cnblogs.com/1971ruru/aggbug/2333775.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/1971ruru/archive/2012/01/31/2333775.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/1971ruru/archive/2011/12/07/2279575.html</id><title type="text">c# pingreply ipaddress in win vista+</title><summary type="text">Hello,I&amp;#39;m using the following code to perform a ping:Ping p = new Ping();p.PingCompleted += new PingCompletedEventHandler(p_PingCompleted);p.SendAsync(new IPAddress(new byte[] { 10, 2, 1, 25 }), 1000);p.Dispose();And then I&amp;#39;m catching the reply this way:void p_PingCompleted(object sender, Pi</summary><published>2011-12-07T08:58:00Z</published><updated>2011-12-07T08:58:00Z</updated><author><name>一修先生</name><uri>http://www.cnblogs.com/1971ruru/</uri></author><link rel="alternate" href="http://www.cnblogs.com/1971ruru/archive/2011/12/07/2279575.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/1971ruru/archive/2011/12/07/2279575.html"/><content type="html">&lt;span   style&gt;&#xD;
Hello,&#xD;
&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
I'm using the following code to perform a ping:&#xD;
&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
Ping p = new Ping();&#xD;
&lt;br /&gt;&#xD;
p.PingCompleted += new PingCompletedEventHandler(p_PingCompleted);&#xD;
&lt;br /&gt;&#xD;
p.SendAsync(new IPAddress(new byte[] { 10, 2, 1, 25 }), 1000);&#xD;
&lt;br /&gt;&#xD;
p.Dispose();&#xD;
&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
And then I'm catching the reply this way:&#xD;
&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
void p_PingCompleted(object sender, PingCompletedEventArgs e) {&#xD;
&lt;br /&gt;&#xD;
PingReply pr = e.Reply;&#xD;
&lt;br /&gt;&#xD;
IPAddress the_pinged_ip = pr.Address;&#xD;
&lt;br /&gt;&#xD;
}&#xD;
&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
My question, this works perfectly fine on windows XP, but: on Vista I get a reply from 10.2.1.139 (my own PC's address) if the ping fails. (similar to the 'ping' command in DOS)&#xD;
&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
Is there a way to find the ACTUAL ip that was pinged?&#xD;
&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
Thanks in advance,&#xD;
&lt;br /&gt;&#xD;
&lt;/span&gt;&#xD;
&lt;p&gt;&lt;span   style&gt;&#xD;
Sam&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;hr /&gt;&#xD;
&lt;p&gt;&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;Roger affirmative, mi amigo.&#xD;
&amp;nbsp;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;span &gt;&#xD;
&lt;br /&gt;&#xD;
Your solution I believe lies in a parameter of the Ping.SendAsync method, known as Object userToken.&#xD;
&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
Change these lines it should work fine.&#xD;
&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
Change your sender to:&#xD;
&lt;br /&gt;&#xD;
System.Net.IPAddress ip = (new byte[] { 10, 2, 1, lowByte }); //or whatever code works with your for..next loop.&#xD;
&lt;br /&gt;&#xD;
p.SendAsync(ip, 1000, ip) //the second "ip" fills the userToken parameter.&#xD;
&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
then in the reply:&#xD;
&lt;br /&gt;&#xD;
System.Net.IPAddress CallerIP = (System.Net.IPAddress)e.UserState;&#xD;
&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
That should work just fine.  If you're getting errors, you might have to send it through as a string and convert it back at the other end, but I don't think you'll have to go thru that much trouble.  Let me know if it doesn't work.&#xD;
&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;hr /&gt;&#xD;
&lt;span &gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&#xD;
&lt;span &gt;&#xD;
Oh My F*cking God !!!!&#xD;
&lt;br /&gt;&#xD;
You have no idea how much I love you right now, I've been searching for something like this for 2 days straight, I've tried to find ways around it using self programmed ping classes with sockets, .. but nothing worked&#xD;
&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
this does the trick,&#xD;
&lt;br /&gt;&#xD;
thank you soooo much.&#xD;
&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
God bless you,&#xD;
&lt;br /&gt;&#xD;
Kind regards,&#xD;
&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
Sam&#xD;
&lt;/span&gt;&#xD;
&lt;img src="http://www.cnblogs.com/1971ruru/aggbug/2279575.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/1971ruru/archive/2011/12/07/2279575.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/1971ruru/archive/2011/11/15/2249879.html</id><title type="text">《转》加密入门（三）：TrueCrypt使用</title><summary type="text">加密入门（三）：TrueCryptPosted on 2011/03/20, 22:24, by Terry Chen, under软件教程.TrueCrypt 是一款功能强大的开源加密工具，利用 TrueCrypt 可以创建一个加密文件作为虚拟加密卷，将需要保护的文件保存在这个加密文件之中，也可以对硬盘分区进行加密，甚至是对系统分区进行加密。下面我们一起来认识一下强大的 TrueCrypt。1. 下载安装 TrueCrypt首先到官方网站下载 TrueCrypt，进入下载页面之后，在 “Windows 7/Vista/XP/2000” 下方点击 Download 按钮下载 Windows 版</summary><published>2011-11-15T08:22:00Z</published><updated>2011-11-15T08:22:00Z</updated><author><name>一修先生</name><uri>http://www.cnblogs.com/1971ruru/</uri></author><link rel="alternate" href="http://www.cnblogs.com/1971ruru/archive/2011/11/15/2249879.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/1971ruru/archive/2011/11/15/2249879.html"/><content type="html">&lt;div  id="post-528"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;加密入门（三）：TrueCrypt&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;small &gt;&#xD;
Posted on 2011/03/20, 22:24, by Terry Chen, under&#xD;
&lt;a href="http://terrychen.info/category/software-tutorial/" title="查看 软件教程 中的全部文章" rel="category tag"&gt;软件教程&lt;/a&gt;&#xD;
.&#xD;
&lt;/small&gt;&#xD;
&lt;p&gt;TrueCrypt 是一款功能强大的开源加密工具，利用 TrueCrypt 可以创建一个加密文件作为虚拟加密卷，将需要保护的文件保存在这个加密文件之中，也可以对硬盘分区进行加密，甚至是对系统分区进行加密。&lt;/p&gt;&#xD;
&lt;p&gt;下面我们一起来认识一下强大的 TrueCrypt。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1. 下载安装 TrueCrypt&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;首先到&#xD;
&lt;a href="http://www.truecrypt.org/"&gt;官方网站&lt;/a&gt;&#xD;
下载 TrueCrypt，进入&#xD;
&lt;a href="http://www.truecrypt.org/downloads"&gt;下载页面&lt;/a&gt;&#xD;
之后，在 &amp;#8220;Windows 7/Vista/XP/2000&amp;#8221; 下方点击 Download 按钮下载 Windows 版本。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;安装过程是英文界面，请按照以下的步骤进行安装：&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
    &lt;li&gt;运行下载的安装程序，进入&amp;#8220;License&amp;#8221;（授权）页面，勾选授权文本下方的&amp;#8220;I accept and agree to be bound by the license terms&amp;#8221;（我同意并接受授权协议的约束）复选框，点击&amp;#8220;Accept&amp;#8221;（接受）即可。&lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    进入&amp;#8220;Wizard Mode&amp;#8221;（向导模式）页面。可供选择的选项有以下两个：&#xD;
    &lt;ul&gt;&#xD;
        &lt;li&gt;Install（安装模式）：正常安装 TrueCrypt，将向注册表中写入相关信息并且创建快捷方式。&lt;/li&gt;&#xD;
        &lt;li&gt;Extract（解压模式）：将 TrueCrypt 解压到指定文件夹，不会向计算机中写入任何信息，执行 TrueCrypt.exe 即可运行 TrueCrypt。&lt;/li&gt;&#xD;
    &lt;/ul&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    假如上一步选择 Install 选项，点击 Next进入&amp;#8220;Setup Mode&amp;#8221;（安装模式）页面，请参照下图文字说明进行设置，设置完成点击 Install（安装）即可开始安装。&#xD;
    &lt;br /&gt;&#xD;
    &lt;a href="http://terrychen.info/wp-content/uploads/encryption-truecrypt-01.png"&gt;&#xD;
    &lt;img src="http://terrychen.info/wp-content/uploads/encryption-truecrypt-01.png" alt="" title="encryption-truecrypt-01" width="577" height="413"  /&gt;&#xD;
    &lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;假如上一步选择 Extract 选项，安装程序将弹出对话框要求确认，文字大意是：假如选择 Extract 选项进行安装，TrueCrypt 每次启动都必须以 Portable Mode（移动模式）运行，因此每次运行时都必须以管理员身份启动，而且触发 UAC（用户帐户控制）提示。确认之后进入下一页面，选择解压路径之后点击&amp;#8220;Extract&amp;#8221;开始解压。&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;安装完成后请到&#xD;
&lt;a href="http://www.truecrypt.org/localizations"&gt;http://www.truecrypt.org/localizations&lt;/a&gt;&#xD;
下载简体中文语言包，下载后解压到 TrueCrypt 的安装目录中，然后运行 TrueCrypt，选择&amp;#8220;Setting&amp;#8221;菜单中的&amp;#8220;Language&amp;#8221;选项，在弹出的对话框中选择&amp;#8220;简体中文&amp;#8221;即可。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2. 创建挂载加密文件/分区&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;创建加密文件/分区是 True Crypt 最基本的加密功能，两者统称为加密卷。在创建方法和使用方法上两者并无太大区别。&lt;/p&gt;&#xD;
&lt;p&gt;按照下述步骤创建加密卷。&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
    &lt;li&gt;&#xD;
    运行 TrueCrypt，选择&amp;#8220;加密卷&amp;#8221;菜单中的&amp;#8220;创建加密卷&amp;#8221;选项，TrueCypt 将弹出加密卷创建向导对话框。此处有三个选项可供选择：&#xD;
    &lt;ul&gt;&#xD;
        &lt;li&gt;创建文件型加密卷：创建加密文件，将机密数据保存在某个加密文件中。&lt;/li&gt;&#xD;
        &lt;li&gt;加密非系统分区/设备：创建加密分区，将机密数据保存在某个加密分区中。&lt;/li&gt;&#xD;
        &lt;li&gt;加密系统分区或者整个系统所在硬盘：将整个系统分区进行加密，在开机之前需要输入密码。&lt;/li&gt;&#xD;
    &lt;/ul&gt;&#xD;
    &lt;p&gt;选择第一项或者第二项，点击下一步继续。&lt;/p&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    进入&amp;#8220;卷类型&amp;#8221;页面，此处有两个选项可供选择：&#xD;
    &lt;ul&gt;&#xD;
        &lt;li&gt;标准TrueCrypt加密卷&lt;/li&gt;&#xD;
        &lt;li&gt;隐藏的TrueCrypt加密卷&lt;/li&gt;&#xD;
    &lt;/ul&gt;&#xD;
    &lt;p&gt;这里选择第一项，后文将对隐藏加密卷这一功能做介绍。点击下一步继续。&lt;/p&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;如果之前选择的是&amp;#8220;创建文件型加密卷&amp;#8221;，现在就进入&amp;#8220;加密卷位置&amp;#8221;页面，在此选择存放加密卷文件的位置，由于 TrueCrypt 允许你使用任何扩展名，你可以使用 .doc 等常见扩展名进行伪装，设置完成之后点击下一步继续。&lt;/li&gt;&#xD;
    &lt;li&gt;如果之前选择的是&amp;#8220;加密非系统分区/设备&amp;#8221;，现在同样进入&amp;#8220;加密卷位置&amp;#8221;页面，不过选择的是需要加密的设备，选择设备之后需要设置&amp;#8220;加密卷创建方式&amp;#8221;，包括&amp;#8220;创建加密卷并格式化&amp;#8221;和&amp;#8220;就地加密分区&amp;#8221;两个选项，设置完成之后点击下一步继续。&lt;/li&gt;&#xD;
    &lt;li&gt;现在进入&amp;#8220;加密选项&amp;#8221;页面，在此可以选择加密算法和哈希算法，默认的设置是 AES 加密算法和 RIPEMD-160 哈希算法，建议保留默认设置即可，设置完毕点击下一步继续。&lt;/li&gt;&#xD;
    &lt;li&gt;进入&amp;#8220;加密卷大小&amp;#8221;页面，如果创建文件型加密卷在此可以指定加密卷的大小，加密卷大小实际上就是加密卷的最大容量，请按照自己的需要和数据大小进行设置，点击下一步继续。&lt;/li&gt;&#xD;
    &lt;li&gt;进入&amp;#8220;加密卷密码&amp;#8221;页面，在此可以选择两种不同的解密方式：密码和密钥文件。两种解密方式可以叠加，设置完毕点击下一步继续。&lt;/li&gt;&#xD;
    &lt;li&gt;进入&amp;#8220;加密卷格式化&amp;#8221;页面，在此可以设置加密卷的文件系统类型、簇大小。如果之前选择的是&amp;#8220;创建文件型加密卷&amp;#8221;，此处可以设置是否动态卷，动态卷是指加密文件的大小根据数据容量自动扩展。如果之前选择的是&amp;#8220;加密非系统分区/设备&amp;#8221;，此处可以设置是否快速格式化，设置完成点击&amp;#8220;格式化&amp;#8221;按钮即可开始创建加密卷的过程。&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;加密卷需要挂载才能使用，请按以下步骤进行挂载：&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
    &lt;li&gt;在 TrueCrypt 主界面点击&amp;#8220;加载文件&amp;#8221;或&amp;#8220;加载设备&amp;#8221;按钮，选择加密文件或者加密分区。&lt;/li&gt;&#xD;
    &lt;li&gt;在盘符列表中选择某个空闲的盘符，点击下方的&amp;#8220;加载&amp;#8221;按钮。&lt;/li&gt;&#xD;
    &lt;li&gt;按照预设的解密方式输入密码或提供密钥文件进行解密。&lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    如果有需要，点击对话框中的&amp;#8220;加载选项&amp;#8221;按钮，可以进一步调整加载设置。&#xD;
    &lt;br /&gt;&#xD;
    &lt;a href="http://terrychen.info/wp-content/uploads/encryption-truecrypt-02.png"&gt;&#xD;
    &lt;img src="http://terrychen.info/wp-content/uploads/encryption-truecrypt-02.png" alt="" title="encryption-truecrypt-02" width="437" height="472"  /&gt;&#xD;
    &lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;挂载完成之后在资源管理器就可以看到加密卷了，使用加密卷与使用普通分区无异，解密处理自动在后台进行，对用户透明。&lt;/p&gt;&#xD;
&lt;p&gt;使用完这个加密卷之后请在 TrueCrypt 主界面下方点击&amp;#8220;卸载&amp;#8221;按钮卸载这一加密卷，以确保数据安全。&lt;/p&gt;&#xD;
&lt;p&gt;假如你需要修改加密卷密码的话，请先将加密卷卸载，然后点击&amp;#8220;加密卷工具&amp;#8221;按钮，在菜单中选择&amp;#8220;更改加密卷密码&amp;#8221;，然后在弹出的对话框中更改密码即可。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3. 创建挂载隐藏加密卷&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;隐藏加密卷是一种迷惑入侵者、隐藏加密数据的方法，即是通过在加密卷中隐藏另一个加密卷来保护保密数据，如果你被强迫要求提供加密卷密码，可以提供外层加密卷密码，入侵者不能证明存在隐藏加密卷。&lt;/p&gt;&#xD;
&lt;p&gt;创建隐藏加密卷的步骤实际上与创建普通加密卷很类似，在创建加密卷向导第二步选择创建隐藏加密卷，然后选择创建隐藏加密卷模式，有以下两种模式可供选择：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
    &lt;li&gt;常规模式：首先创建一个普通加密卷作为外层加密卷，然后创建内层隐藏加密卷。&lt;/li&gt;&#xD;
    &lt;li&gt;直接模式：利用已经创建的普通加密卷作为外层加密卷，然后创建内层隐藏加密卷。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;此后步骤与创建普通加密卷类似，请按照向导操作即可。&lt;/p&gt;&#xD;
&lt;p&gt;挂载隐藏加密卷的方法是直接输入隐藏加密卷的密码，也就是说，载入的加密卷是外层加密卷还是隐藏加密卷是依靠输入的密码来决定的，而非先载入外层加密卷，再载入隐藏加密卷。&lt;/p&gt;&#xD;
&lt;p&gt;由于隐藏加密卷和外层加密卷共用空间，所以向外层加密卷写入数据可能破坏隐藏加密卷，所以在隐藏加密卷创建完成之后不要再修改外层加密卷的内容，如果需要修改请在挂载时对隐藏加密卷进行保护，以免导致隐藏加密卷被破坏。方法如下：&lt;/p&gt;&#xD;
&lt;p&gt;在挂载外层加密卷输入密码时，点击&amp;#8220;加载选项&amp;#8221;，在弹出的&amp;#8220;加载选项&amp;#8221;对话框中选择&amp;#8220;向外层加密卷写入数据时保护隐藏加密卷&amp;#8221;，然后输入隐藏加密卷密码加载即可对隐藏加密卷进行写入保护。但是应该注意的是保护隐藏加密卷会使别人很容易发现隐藏加密卷，因为 TrueCrypt 中显示的加密卷类型是&amp;#8220;外层&amp;#8221;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;4. 加密系统分区&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在对系统分区进行加密之前请做好以下的准备工作：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
    &lt;li&gt;准备一张空白光盘以刻录 TrueCrypt 应急盘，或者安装虚拟光驱软件。&lt;/li&gt;&#xD;
    &lt;li&gt;确认 TrueCrypt 为安装版。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;请按照以下步骤进行设置：&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
    &lt;li&gt;启动&amp;#8220;创建加密卷&amp;#8221;向导，选择&amp;#8220;加密系统分区或者系统所在硬盘&amp;#8221;选项，点击&amp;#8220;下一步&amp;#8221;继续。&lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    进入&amp;#8220;系统加密类型&amp;#8221;页面，此处有两个选项可供选择：&#xD;
    &lt;ul&gt;&#xD;
        &lt;li&gt;常规：直接对系统分区或整个硬盘进行加密。&lt;/li&gt;&#xD;
        &lt;li&gt;隐藏：创建隐藏操作系统，类似于隐藏加密卷。&lt;/li&gt;&#xD;
    &lt;/ul&gt;&#xD;
    &lt;p&gt;此处我们选择第二项，点击下一步继续。&lt;/p&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    进入&amp;#8220;要加密的区域&amp;#8221;页面，此处有两个选项可供选择：&#xD;
    &lt;ul&gt;&#xD;
        &lt;li&gt;加密 Windows 所在的分区：仅仅加密 Windows 安装所在的分区，通常是指C盘。&lt;/li&gt;&#xD;
        &lt;li&gt;加密整个硬盘：将安装 Windows 的硬盘进行加密。&lt;/li&gt;&#xD;
    &lt;/ul&gt;&#xD;
    &lt;p&gt;请根据自己的需要选择，点击&amp;#8220;下一步&amp;#8221;继续。&lt;/p&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;假如刚才选择加密整个硬盘，向导将询问是否加密主机保护区域，建议选择&amp;#8220;否&amp;#8221;，点击下一步继续。&lt;/li&gt;&#xD;
    &lt;li&gt;现在进入&amp;#8220;操作系统数目&amp;#8221;页面，请根据实际情况选择&amp;#8220;单系统&amp;#8221;或者&amp;#8220;多重启动&amp;#8221;（建议多重启动用户不要使用此类加密），点击下一步继续。&lt;/li&gt;&#xD;
    &lt;li&gt;此后几个步骤与创建普通加密卷相同，包括选择加密算法和输入密码等等，根据向导设置即可。&lt;/li&gt;&#xD;
    &lt;li&gt;现在 TrueCrypt 会要求刻录 TrueCrypt 应急盘，必须刻录之后才能继续。如果不想刻录的话使用虚拟光驱挂载镜像文件即可，验证光盘完毕之后点击&amp;#8220;下一步&amp;#8221;。&lt;/li&gt;&#xD;
    &lt;li&gt;现在 TrueCrypt 会询问擦除模式，可选选项为&amp;#8220;不擦除&amp;#8221;、&amp;#8220;3 次擦除&amp;#8221;、&amp;#8220;7 次擦除&amp;#8221;和&amp;#8220;35 次擦除&amp;#8221;，擦除次数越多，数据安全性越好，但耗费时间就越长，设置完成后点击&amp;#8220;下一步&amp;#8221;。&lt;/li&gt;&#xD;
    &lt;li&gt;现在 TrueCrypt 会对系统进行预测试，点击&amp;#8220;测试&amp;#8221;按钮重启计算机进行测试，重启后 Windows 启动之前会要求输入密码。&lt;/li&gt;&#xD;
    &lt;li&gt;进入系统之后 TrueCrypt 会提示可以开始加密，注意开始加密之后无法中途取消，只能暂停或者推迟加密操作。&lt;/li&gt;&#xD;
    &lt;li&gt;加密完成，以后每次开机都需要输入密码才能使用操作系统。&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;假如你需要对加密的系统进行解密的话，运行 TrueCrypt，选择&amp;#8220;系统&amp;#8221;菜单中的&amp;#8220;永久解密系统分区/驱动器&amp;#8221;，确认之后即可开始解密。&lt;/p&gt;&#xD;
&lt;p&gt;TrueCrypt 是一个既专业又易用的加密软件，可以为本机的机密数据提供高质量的加密保护，推荐对数据安全有较高要求的朋友使用。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;本文历史：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
    &lt;li&gt;2011 年 3 月 20 日：初稿完成&lt;/li&gt;&#xD;
    &lt;li&gt;2011 年 8 月 13 日：精简文字，调整结构&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;ul&gt;&#xD;
    &lt;p&gt;&lt;strong&gt;加密入门系列：&lt;/strong&gt;&lt;/p&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://terrychen.info/encryption-preface/"&gt;加密入门系列序言&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://terrychen.info/encryption-efs/"&gt;加密入门（一）：EFS&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://terrychen.info/encryption-bitlocker/"&gt;加密入门（二）：BitLocker&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://terrychen.info/encryption-truecrypt/"&gt;加密入门（三）：TrueCrypt&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://terrychen.info/encryption-gpg4win/"&gt;加密入门（四）：Gpg4win&lt;/a&gt;&#xD;
    &lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;img src="http://www.cnblogs.com/1971ruru/aggbug/2249879.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/1971ruru/archive/2011/11/15/2249879.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/1971ruru/archive/2011/11/09/2242495.html</id><title type="text">Virtualbox运行报cannot access the kernel driver的解决方法</title><summary type="text">之前有个问virtualbox便携版本运行时候出现cannot access the kernel driver的问题，通过这个方法应该也能解决，具体就是重新编译一下virtualbox的内核驱动模块。步骤：1）先关闭自己的防火墙跟杀毒软件（最好先断网，中了小马可就不好玩了），不关闭的话直接运行有可能会出现未知错误的提示;2）进入C:\Program Files\Oracle\VirtualBox\drivers\vboxdrv文件夹（具体看自己的vbox程序是安装或者放什么地方了），找到vboxdrv.inf这个文件，鼠标右键点，然后选择安装;一般只有升级的时候才会有重新安装内核驱动模块的事</summary><published>2011-11-09T06:31:00Z</published><updated>2011-11-09T06:31:00Z</updated><author><name>一修先生</name><uri>http://www.cnblogs.com/1971ruru/</uri></author><link rel="alternate" href="http://www.cnblogs.com/1971ruru/archive/2011/11/09/2242495.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/1971ruru/archive/2011/11/09/2242495.html"/><content type="html">之前有个问virtualbox便携版本运行时候出现cannot access the kernel driver的问题，通过这个方法应该也能解决，具体就是重新编译一下virtualbox的内核驱动模块。&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
步骤：&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
1）先关闭自己的防火墙跟杀毒软件（最好先断网，中了小马可就不好玩了），不关闭的话直接运行有可能会出现未知错误的提示;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
2）进入C:\Program Files\Oracle\VirtualBox\drivers\vboxdrv文件夹（具体看自己的vbox程序是安装或者放什么地方了），找到vboxdrv.inf这个文件，鼠标右键点，然后选择安装;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
一般只有升级的时候才会有重新安装内核驱动模块的事，不过如果在windows下运行vbox出现cannot access the kernel driver 的错误这不失为一个解决方法。&lt;br /&gt;&#xD;
&lt;img src="http://www.cnblogs.com/1971ruru/aggbug/2242495.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/1971ruru/archive/2011/11/09/2242495.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
