<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_JOY 技术专题</title><subtitle type="text">Jump over yourself !!</subtitle><id>http://feed.cnblogs.com/blog/u/41415/rss</id><updated>2011-12-21T09:25:51Z</updated><author><name>JOY</name><uri>http://www.cnblogs.com/wuhen/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wuhen/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/41415/rss"/><entry><id>http://www.cnblogs.com/wuhen/archive/2011/12/21/2227323.html</id><title type="text">vim 技巧集</title><summary type="text">这些是我在学校的时候，为linux协会准备的一些资料。当时，把vim的文档全部看了一遍，从中挑选出自己觉得很有用的整理成了。做成handbook形式，便于查看。 vi技巧集 技巧1:关于帮助的帮助 查找帮助: 键入 &amp;quot;:help word&amp;quot;, 接着键入 CTRL-D 可以看到匹配&amp;quot;word&amp;quot; 的帮助主题. 类别 前缀 例子 普通模式命令 (无) :help x Visual 模式命令 v_ :help v_u 插入模式命令 i_ :help i_ 命令行模式命令 : :help :quit 命令行编辑 c_ :help c_...</summary><published>2011-12-21T09:26:00Z</published><updated>2011-12-21T09:26:00Z</updated><author><name>JOY</name><uri>http://www.cnblogs.com/wuhen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wuhen/archive/2011/12/21/2227323.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wuhen/archive/2011/12/21/2227323.html"/><content type="html">&lt;p&gt;这些是我在学校的时候，为linux协会准备的一些资料。当时，把vim的文档全部看了一遍，从中挑选出自己觉得很有用的整理成了。做成handbook形式，便于查看。    &lt;br /&gt;vi技巧集     &lt;br /&gt;技巧1:关于帮助的帮助     &lt;br /&gt;查找帮助: 键入 &amp;quot;:help word&amp;quot;, 接着键入 CTRL-D 可以看到匹配&amp;quot;word&amp;quot; 的帮助主题.     &lt;br /&gt;类别 前缀 例子     &lt;br /&gt;普通模式命令 (无) :help x     &lt;br /&gt;Visual 模式命令 v_ :help v_u     &lt;br /&gt;插入模式命令 i_ :help i_     &lt;br /&gt;命令行模式命令 : :help :quit     &lt;br /&gt;命令行编辑 c_ :help c_     &lt;br /&gt;Vim 命令参数 - :help -r     &lt;br /&gt;选项 ' :help 'textwidth'     &lt;br /&gt;技巧2:vi初学者30分钟教程     &lt;br /&gt;键入：vimtutor [语言]     &lt;br /&gt;语言参数可以是:fr it等，rh9有繁体的教程，暂时没有简体中文教程。     &lt;br /&gt;技巧3：确定你的位置     &lt;br /&gt;方法1：使用 命令。此命令显示vi状态信息，包括正在编辑的文件名、是否修改过、当前行号、文件的行数以及光标之前的行占整个文件的百分比。有时你会看到一个“裂开”的列号，是由于使用了Tab字符。     &lt;br /&gt;方法2：设置'number'选项。     &lt;br /&gt;在每行的前面加上一个行号：“:set number”;     &lt;br /&gt;要重新关闭这个选项：“:set nonumber”。     &lt;br /&gt;方法3：设置'ruler'选项。这会在Vim窗口的右下角显示当前光标的位置：     &lt;br /&gt;:set ruler     &lt;br /&gt;技巧4: 中止命令     &lt;br /&gt;比如：输入”f“后发现应该是“F”，就可以用来中止f命令。     &lt;br /&gt;技巧5: 让最后一行处于屏幕的中间     &lt;br /&gt;当到达了最后一行的时候，光标会行处于屏幕的底部。     &lt;br /&gt;“zz”命令能让最后一行显示在屏幕中间；     &lt;br /&gt;“zt”把光标所在行移动到屏幕的顶部；     &lt;br /&gt;“zb”则移动到屏幕的底部。     &lt;br /&gt;技巧6: 显示标记     &lt;br /&gt;你可以用如下命令取得所有的标记的列表：“ :marks”     &lt;br /&gt;用这个命令后，你会发现有一下特殊的标记，包括：     &lt;br /&gt;' 跳转前的位置     &lt;br /&gt;&amp;quot; 最后编辑的位置     &lt;br /&gt;[ 最后修改的位置的开头     &lt;br /&gt;] 最后修改的位置的结尾     &lt;br /&gt;技巧7: 操作符与动作     &lt;br /&gt;你可以使用“dw”命令来删除一个单词，它是命令“d”+动作“w”。还可以加上数字，如“d4w”或者“4dw”来删除4个单词。     &lt;br /&gt;类似的常用命令有：     &lt;br /&gt;x 表示 dl （删除当前光标下的字符）     &lt;br /&gt;X 表示 dh （删除光标左边的字符）     &lt;br /&gt;D 表示 d$ （删除到行尾）     &lt;br /&gt;C 表示 c$ （修改到行尾）     &lt;br /&gt;s 表示 cl （修改一个字符）     &lt;br /&gt;S 表示 cc （修改一整行）     &lt;br /&gt;技巧8: 替换单个字符     &lt;br /&gt;“rx”命令，使用x替换当前字符，x可以是任意字符，键也可以；     &lt;br /&gt;“nrx”命令，可以用一个字符替换多个字符，如&amp;quot;4ra&amp;quot;;     &lt;br /&gt;技巧9: 重复命令“.”的使用     &lt;br /&gt;例如，假设你在编辑一个HTML文件，你想删除所有的标记。你把光标移到第一个“”命令删除，然后你就可以移到的”）。要删除下一个标记，移动到下一个 在行首输入“#include &amp;quot;”     &lt;br /&gt;$ 移到行末     &lt;br /&gt;a&amp;quot; 在行末加上双引号“&amp;quot;”     &lt;br /&gt;j 移到下一行     &lt;br /&gt;q 结束记录     &lt;br /&gt;现在，你已经完成一个修改了，你可以通过重复三次“@a”完成余下的修改。     &lt;br /&gt;技巧8. 寄存器的扩展技巧     &lt;br /&gt;记录到一个大写寄存器表示扩展命令到对应的小写寄存器。     &lt;br /&gt;假设已经记录了一个修改一个单词的命令到寄存器c中。它可以正常工作，现在你需要加一个搜索命令以便找到下一个单词来修改。这可以通过如下命令来完成：     &lt;br /&gt;qC/wordq     &lt;br /&gt;这种方法在宏记录，拷贝和删除命令中都有效。例如，你需要把选择一些行到一个寄存器中，可以先这样拷贝第一行：     &lt;br /&gt;&amp;quot;aY     &lt;br /&gt;然后移到下一个要拷贝的地方，执行：     &lt;br /&gt;&amp;quot;AY     &lt;br /&gt;如此类推。这样在寄存器a中就会包括所有你要拷贝的行。     &lt;br /&gt;技巧1.替换命令中的范围的确定     &lt;br /&gt;方法1. 使用行号：     &lt;br /&gt;例如,“n,m” --从第n行到第m行；     &lt;br /&gt;“n” --第n行     &lt;br /&gt;“-3,$+5” --从上面第三行到文末倒数第五行的范围；     &lt;br /&gt;方法2. 使用匹配模式：     &lt;br /&gt;例如，“:?^Chapter?,/^Chapter/s=grey=gray=g”，为了避免斜杠使用的混淆，在这种情况下，“=”字符用于代替斜杠。使用斜杠或使用其他字符也是可以的。     &lt;br /&gt;方法3. 使用标记：     &lt;br /&gt;例如，先用“mt”标记开头，再用“mb”标记结尾。然后就可以用标记表示一个范围（包括标记的那一行）：     &lt;br /&gt;:'t,'b     &lt;br /&gt;方法4. 使用可视模式：     &lt;br /&gt;先用V选定范围，再输入“:”会出现“:'”，现在，只需要输入剩下的命令；     &lt;br /&gt;注意：     &lt;br /&gt;如果使用可视模式选中行的一部分，或者用 CTRL-V 选中一个文本块，然后     &lt;br /&gt;执行冒号命令，命令仍作用于行范围，而不是选中的范围。这可能会在以后     &lt;br /&gt;的版本中修正。     &lt;br /&gt;技巧2. 使用全局命令     &lt;br /&gt;它允许你找到一个匹配点并且在上面执行一个命令。它的一般形式是：     &lt;br /&gt;“:[range]global/{pattern}/{command}”     &lt;br /&gt;例如：把“foobar”修改为“barfoo”，但只需要修改C++风格的注释中的内容。这种注释以“//”开头。所以可以使用如下命令：     &lt;br /&gt;“:g+//+s/foobar/barfoo/g”     &lt;br /&gt;注意：global中只能使用冒号命令。普通命令不能在这里使用，如果需要，可以使用normal命令。     &lt;br /&gt;技巧3. 改变大小写     &lt;br /&gt;“gu”--改为小写；“gugu”“guu”是把一行变为小写；     &lt;br /&gt;“gU”--改为大写；“gUgU”“gUU”是把一行变为大写；     &lt;br /&gt;“g~”--改变大小写；“g~g~”“g~~”是改变一行。     &lt;br /&gt;这三个命令都可以作用于“动作”命令，文本对象和可视模式。     &lt;br /&gt;技巧4. 使用外部命令的例子     &lt;br /&gt;例子1:对1到5行进行排序。     &lt;br /&gt;先把光标定位在第一行，然后执行下面的命令： “!5G”     &lt;br /&gt;现在光标移到了屏幕的底部，并显示一个“!”作提示符。     &lt;br /&gt;现在你可以输入过滤程序的名字，在本例中就是“sort”了。因此，你整个命令将是： !5Gsort     &lt;br /&gt;例子2:“!!date”     &lt;br /&gt;用“date”的输出代替当前行。这在为文件加入时间戳的时候非常有用。     &lt;br /&gt;技巧5. 读入一个命令的输出     &lt;br /&gt;要把当前目录的内容读进来，可以用如下命令：“:read !ls”；     &lt;br /&gt;加上一个“!”让Vim知道后面是一个命令。这些命令还可以带参数。     &lt;br /&gt;而且前面还可以带一个范围用于告诉Vim把这行放在什么地方：“:0read !date -u”     &lt;br /&gt;技巧6. 把文本输出到一个命令     &lt;br /&gt;要统计当前文件有多少行，可以这样：     &lt;br /&gt;“:write !wc”     &lt;br /&gt;注意不要错写成： :write! wc     &lt;br /&gt;这会强制把当前文件存到当前目录的“wc”中。在这里空白字符的位置是非常重要的。     &lt;br /&gt;技巧7. 单词统计     &lt;br /&gt;如果你需要计算的是整个文件的字数，先移到文件第一行开头，然后用这个命令：     &lt;br /&gt;“g”“CTRL-G”     &lt;br /&gt;可以使用可视模式，选中要计算字数的文本，然后输入“g CTRL-G”；     &lt;br /&gt;技巧8. 查阅man信息     &lt;br /&gt;把光标移到对应的单词上然后输入：“K”     &lt;br /&gt;如果需要在新窗口中打开Man手册，则需要使用加载man文件类型的外挂：     &lt;br /&gt;“:source $VIMRUNTIME/ftplugin/man.vim”     &lt;br /&gt;然后用“:Man”命令打开一个显示man手册的窗口。如“Man feof”“Man 3 echo”；     &lt;br /&gt;现在，还可以用“\K”开个新窗口显示Man手册了。     &lt;br /&gt;快速键入命令行命令     &lt;br /&gt;技巧0. 更快速的键入命令     &lt;br /&gt;Vim 具备若干基本功能，以简化键入命令的工作。 你可以缩写，编辑和重复分号命令，     &lt;br /&gt;而补全功能几乎可以用于所有的场合。     &lt;br /&gt;当你用分号(:)命令或者用 / 或 ? 搜索一个字符串时, Vim 就会把光标置于屏幕下方，     &lt;br /&gt;你在那儿键入命令或者搜索模式， 此处即称为命令行, 也是用来输入搜索命令的地方。     &lt;br /&gt;技巧1. 移动     &lt;br /&gt;命令行上移动光标时最常用的键:     &lt;br /&gt;左移一个字符     &lt;br /&gt;右移一个字符     &lt;br /&gt;或&amp;#160; 左移一个单词     &lt;br /&gt;或&amp;#160; 右移一个单词     &lt;br /&gt;CTRL-B 或&amp;#160; 命令行首位     &lt;br /&gt;CTRL-E 或&amp;#160; 命令行末位     &lt;br /&gt;注意:     &lt;br /&gt;并非在所有键盘上都有效。其它 Shift 和 Control组合键也有这个问题。     &lt;br /&gt;技巧2 删除     &lt;br /&gt;除了删除键，外，还可以用；     &lt;br /&gt;CTRL-W 删除光标前整个单词用 ；     &lt;br /&gt;CTRL-U 删除命令行上全部文字, 从而让你从头开始；     &lt;br /&gt;技巧3. 取消     &lt;br /&gt;方法1：用键删除全部字符；     &lt;br /&gt;方法2: 用取消；     &lt;br /&gt;方法3: 用CTRL+C取消；     &lt;br /&gt;技巧4. 命令行缩写     &lt;br /&gt;有些 &amp;quot;:&amp;quot; 分号命令确实很长。幸运的是所有 &amp;quot;:&amp;quot; 分号命令都可以被缩写。     &lt;br /&gt;比如可以把置换命令 “:substitute”缩写成&amp;quot;:s&amp;quot;。     &lt;br /&gt;“:s”是“:substitute”的缩写，而不是“:set”的缩写，它的缩写是“:se”。     &lt;br /&gt;“:substitute”最简形式是 &amp;quot;:s&amp;quot;,不可能更简单，但可以更复杂，即 &amp;quot;:su&amp;quot; 和 &amp;quot;:sub&amp;quot; 都有效。     &lt;br /&gt;最短的有效缩写形式可以在帮助文件里找到。     &lt;br /&gt;技巧5. 命令行补全     &lt;br /&gt;命令和文件都能用补全，并且能针对上下文做智能判断。     &lt;br /&gt;比如：键入“:e”，会出现“:edit”，再按一次，成了“:echo”，这和shell中的不一样；     &lt;br /&gt;假设要编辑的文件是：“foo.txt”，则键入“:edit f”，就会显示出以“f”开头的文件。     &lt;br /&gt;再最后一个匹配文件名上按，会出现最初键入的内容，vim会在匹配表内周而复始地循环。     &lt;br /&gt;：依相反方向循环匹配列表；     &lt;br /&gt;：显示全部匹配；     &lt;br /&gt;：把词补全为最长无歧义字符串；     &lt;br /&gt;技巧6. 命令行历史     &lt;br /&gt;：用在命令行上已经键入的文本去跟历史记录里的命令作比较, 只有匹配的命令才被显示出来;     &lt;br /&gt;：回到较晚的命令，命令能帮你消除光标前的字符以便重新输入；     &lt;br /&gt;“:history” ：显示&amp;quot;:&amp;quot; 分号命令的历史记录；     &lt;br /&gt;“:history /”：显示搜索命令的历史记录；     &lt;br /&gt;“q:”：打开命令行窗口；     &lt;br /&gt;离开和回来     &lt;br /&gt;技巧1. 挂起和继续     &lt;br /&gt;方法1：用 CTRL-Z 挂起vim程序，进入shell，最后用 &amp;quot;fg&amp;quot; 命令回到 Vim ；     &lt;br /&gt;方法2：当 CTRL-Z 不起作用时，可以用“:suspend”;     &lt;br /&gt;注意：别忘了把 Vim 引导回前台,否则你会失去所有的修改!     &lt;br /&gt;技巧2. 执行shell命令     &lt;br /&gt;方法1：使用CTRL+Z 挂起Vim；     &lt;br /&gt;方法2：“:shell”命令重开一个终端，“exit”退出后就返回；     &lt;br /&gt;方法2：&amp;quot;:!{command}&amp;quot;，比如：“:!ls”；     &lt;br /&gt;常用的“!”命令有：     &lt;br /&gt;:!{program} 执行 {program}     &lt;br /&gt;:r !{program} 执行 {program} 并读取其输出     &lt;br /&gt;:w !{program} 执行 {program} 传送文本至其输入     &lt;br /&gt;:[range]!{program} 经由 {program} 过滤文本     &lt;br /&gt;技巧3. 在编辑模式下执行命令     &lt;br /&gt;方法1：用退出编辑模式，进入命令模式；     &lt;br /&gt;方法2：用进入命令模式，执行完命令后返回编辑模式；     &lt;br /&gt;文件浏览器     &lt;br /&gt;技巧1. 文件浏览器怎么用？     &lt;br /&gt;“:edit .”：“.”表示当前路径，用其他路径也行;     &lt;br /&gt;编辑文件：移动到一个文件名上并按下 键；     &lt;br /&gt;进入该目录：移动到目录上并按下 键；     &lt;br /&gt;常用键：     &lt;br /&gt;&amp;quot;-&amp;quot; 键 进入父目录“..”     &lt;br /&gt;o 开启一个新窗口     &lt;br /&gt;O 利用最近访问过的窗口     &lt;br /&gt;p 利用预览窗口, 并把光标撤回浏览器窗口     &lt;br /&gt;技巧2. 排序     &lt;br /&gt;i 显示文件大小和日期. 再执行一次 i 命令将隐藏这些信息     &lt;br /&gt;s 根据光标所在的字段排序, 先以 i 命令显示文件大小和日期,     &lt;br /&gt;然后把光标移到任一文件的一个字段上, 并按 s 键     &lt;br /&gt;r 逆转排列顺序 (大小或日期二者择一)     &lt;br /&gt;技巧3. 常用操作     &lt;br /&gt;c 把当前目录改成显示在窗口中的那个目录     &lt;br /&gt;:cd 改变当前目录     &lt;br /&gt;:pwd 发现哪个目录是当前目录     &lt;br /&gt;R 为光标下文件改名     &lt;br /&gt;D 删除光标下文件     &lt;br /&gt;技巧4. 查找文件     &lt;br /&gt;假设有一个 C 程序, 该程序有这样一行:     &lt;br /&gt;#include &amp;quot;inits.h&amp;quot;     &lt;br /&gt;想要查看文件 &amp;quot;inits.h&amp;quot; 里有些什么。     &lt;br /&gt;把光标移到该文件名上, 并键入: “gf”     &lt;br /&gt;Vim 就会找到并打开这个文件。     &lt;br /&gt;技巧5. 加密     &lt;br /&gt;方法1： &amp;quot;-x&amp;quot; 参数，比如“vim -x foo.txt”,读加密文件是不要加上“-x”参数;     &lt;br /&gt;方法2：“:set key=xxx”命令。“key”“key=”“key=&amp;quot;xxx&amp;quot;”都是去掉密码的意思;     &lt;br /&gt;技巧：“&amp;quot;”“\”等有特殊意义的符号，写成“\&amp;quot;”“\\”；     &lt;br /&gt;方法3:“:X”命令，好处在于不会以明文显示密码，同时也不用输入多余的“\”符号；     &lt;br /&gt;技巧6. 加密的麻烦     &lt;br /&gt;麻烦1：Vim 采用的加密算法有弱点的,防止偷窥者是绰绰有余了, 但不足以防止一个手上有大量时间的密码专家     &lt;br /&gt;麻烦2:交换文件是不加密的; 所以当你在编辑文件时, 拥有超级用户权限的人是能够读取未经加密的来自这个文件的交换文件文本的，     &lt;br /&gt;可以使用“vim -x -n file.txt”或者“:setlocal noswapfile”来防止产生交换文件；     &lt;br /&gt;麻烦3:打开一个加密文件，然后输入错误密码，再对文件进行“:X”操作，这样，谁都没法看文件了。     &lt;br /&gt;二进制文件的一些技巧     &lt;br /&gt;技巧1. 打开二进制文件     &lt;br /&gt;打开二进制文件，要使用“-b”的参数，     &lt;br /&gt;这是为了不让vim对文件做任何改动，     &lt;br /&gt;vim是个聪明的程序，但不能用在这里；     &lt;br /&gt;技巧2. 用 Hex 格式来阅读字符     &lt;br /&gt;方法1:“:set display=uhex”命令；     &lt;br /&gt;方法2:“ga”命令显示光标下的字符值；     &lt;br /&gt;技巧3. 显示当前字节位置，和移到     &lt;br /&gt;“g CTRL-G”；     &lt;br /&gt;要移到文件中某个指定的字节，用“go”命令，     &lt;br /&gt;技巧4. 使用xxd外部程序     &lt;br /&gt;首先以二进制方式编辑这个文件：“vim -b datafile”     &lt;br /&gt;然后用 xxd把文件转换成十六进制：“:%!xxd”     &lt;br /&gt;显示效果：     &lt;br /&gt;0000000: 1f8b 0808 39d7 173b 0203 7474 002b 4e49 ....9..;..tt.+NI     &lt;br /&gt;0000010: 4b2c 8660 eb9c ecac c462 eb94 345e 2e30 K,.`.....b..4^.0     &lt;br /&gt;Vim 把这些信息当作普通文本来对待，     &lt;br /&gt;注意，修改了十六进制部分并不导致可打印字符部分的改变, 反之亦然(能理解吗？)；     &lt;br /&gt;最后, 记得把它转换回来:“:%!xxd -r”；     &lt;br /&gt;注意，只有十六进制部分的修改才会被采用，右边可打印文本部分的修改忽略不计。     &lt;br /&gt;技巧5. 可视模式下的重复     &lt;br /&gt;&amp;quot;gv&amp;quot; 命令再次选择上次选过的文本；     &lt;br /&gt;技巧6. 查找时忽略大小写     &lt;br /&gt;默认情况下, Vim 的查找是大小写敏感的；     &lt;br /&gt;方法1:     &lt;br /&gt;“:set ignorecase”关闭大小写敏感；     &lt;br /&gt;“:set noignorecase”重新开启；     &lt;br /&gt;“:set ignorecase smartcase”：     &lt;br /&gt;如果键入的字符串全是小写，说明忽略大小写；如果出现了大写字母，则说明是大小写敏感的；     &lt;br /&gt;方法2:     &lt;br /&gt;在模式前附加 &amp;quot;\c&amp;quot; 字符串表示忽略一个特定的模式里的大小写;     &lt;br /&gt;附加 &amp;quot;\C&amp;quot; 将使该模式的匹配大小写敏感;     &lt;br /&gt;技巧7. 折叠命令“zi”实用的操作方法:     &lt;br /&gt;- 创建折叠, 以获取文件的全貌     &lt;br /&gt;- 移动到要操作的地方     &lt;br /&gt;- 执行“zi”以便一边看着文本, 一边编辑     &lt;br /&gt;- 再执行“zi”以便移动到另一处     &lt;br /&gt;技巧8. 复制, 删除和粘贴折叠     &lt;br /&gt;可以把折叠看成一个单行来对其进行操作，比如这个实用操作：     &lt;br /&gt;- 把光标置于被移文本的首行     &lt;br /&gt;- 用“V”键开始可视模式     &lt;br /&gt;- 把光标置于被移文本的末行     &lt;br /&gt;- 用“d”键删除被选中的行     &lt;br /&gt;- 把光标移到新位置, 用“p” 键把文本粘贴在那儿     &lt;br /&gt;技巧9. “%”使用技巧     &lt;br /&gt;假设有这样一段代码：     &lt;br /&gt;#ifdef USE_POPEN     &lt;br /&gt;fd = popen(&amp;quot;ls&amp;quot;, &amp;quot;r&amp;quot;)     &lt;br /&gt;#else     &lt;br /&gt;fd = fopen(&amp;quot;tmp&amp;quot;, &amp;quot;w&amp;quot;)     &lt;br /&gt;#endif     &lt;br /&gt;在“#ifdef” 处按“ %”，Vim 会跳转到“#else”；继续按“%”会跳转到“#endif”；再次按下“%”又回到“#ifdef”；     &lt;br /&gt;注意，使用“%”需要光标在“#”所在行；如果光标在代码内部，可以用“[#”“]#”命令向前向后跳转；     &lt;br /&gt;技巧10. 键入任意编码     &lt;br /&gt;编码 键入 范围     &lt;br /&gt;8-bit CTRL-V 123 decimal 0-255     &lt;br /&gt;8-bit CTRL-V x a1 hexadecimal 00-ff     &lt;br /&gt;16-bit CTRL-V u 013b hexadecimal 0000-ffff     &lt;br /&gt;31-bit CTRL-V U 001303a4 hexadecimal 00000000-7fffffff     &lt;br /&gt;技巧11. 在类内部用“[m” 找到前一个方法的开始；“]m” 找到下一个方法的开始。     &lt;br /&gt;技巧1. “.”的使用例子     &lt;br /&gt;假设要把“four”修改成“five”，有好几个地方要作这种修改。     &lt;br /&gt;操作步骤：     &lt;br /&gt;/four 找到第一个“four”     &lt;br /&gt;cwfive 修改成“five”     &lt;br /&gt;n 找下一个“four”     &lt;br /&gt;. 重复修改操作     &lt;br /&gt;n 找下一个“four”     &lt;br /&gt;. 重复修改     &lt;br /&gt;如此类推……     &lt;br /&gt;技巧2. 分割窗口的技巧     &lt;br /&gt;很多编辑另一个文件的命令都有一个分割窗口的变量。     &lt;br /&gt;对于命令模式，这通过前置一个“s”实现。例如“:tag”跳到一个标记，“stag”分割出一个新窗口并跳到那个标记。     &lt;br /&gt;对于普通模式，前置一个 CTRL-W 可以完成这个功能。例如，CTRL-^ 跳到备选文件，而 CTRL-W CTRL-^ 打开一个新窗口并编辑备选文件。     &lt;br /&gt;技巧3. 使用.vimrc文件     &lt;br /&gt;这个文件放在“~/” 下；     &lt;br /&gt;常用设置：     &lt;br /&gt;set fileencodings=cp936     &lt;br /&gt;set encoding=cp936     &lt;br /&gt;source $VIMRUNTIME/ftplugin/man.vim 用“:Man”“\K”开个新窗口查看man手册     &lt;br /&gt;set incsearch 增量匹配     &lt;br /&gt;set showcmd 窗口右下角，标尺的右边显示未完成的命令     &lt;br /&gt;set display=uhex 以形式显示不可打印字符     &lt;br /&gt;set showmatch 显示匹配，如“()”“[]”     &lt;br /&gt;set ignorecase smartcase 智能忽略大小写，可以用“\c”“\C”指点是否忽略；     &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;本文来自ChinaUnix博客，如果查看原文请点：&lt;/strong&gt;&lt;a href="http://blog.chinaunix.net/u/10599/showart_169720.html"&gt;http://blog.chinaunix.net/u/10599&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://blog.chinaunix.net/u/10599/showart_169720.html"&gt;/showart_169720.html&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/wuhen/aggbug/2227323.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wuhen/archive/2011/12/21/2227323.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wuhen/archive/2011/10/28/2227366.html</id><title type="text">Emacs 中的查找</title><summary type="text">最基本的东西 C-s 开始正向查找 C-r 开始方向查找 这两个命令进入了查找模式，在 Emacs 中的术语叫做 Incremental Search ， 也就是在你输入要查找的字符的时候，同时高亮显示找到的部分。 在查找模式下的一些操作 下面的操作都是先按 C-s 或者 C-r 后，进入 Incremental Search M...</summary><published>2011-10-28T02:33:00Z</published><updated>2011-10-28T02:33:00Z</updated><author><name>JOY</name><uri>http://www.cnblogs.com/wuhen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wuhen/archive/2011/10/28/2227366.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wuhen/archive/2011/10/28/2227366.html"/><content type="html">&lt;p&gt;&lt;strong&gt;最基本的东西&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;C-s 开始正向查找 &lt;/li&gt;    &lt;li&gt;C-r 开始方向查找      &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;       &lt;p&gt;这两个命令进入了查找模式，在 Emacs 中的术语叫做 Incremental Search ， 也就是在你输入要查找的字符的时候，同时高亮显示找到的部分。&lt;/p&gt;     &lt;/blockquote&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;在查找模式下的一些操作&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;下面的操作都是先按 C-s 或者 C-r 后，进入 Incremental Search Mode 之后的操作。&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;C-r , C-s ， 分别是向前查找和向后查找当前输入的内容。      &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;       &lt;p&gt;如果当前内容是空的，也就是说你连续两次输入 C-s ，那么就是 “查找下一个 (Find next)”的操作。第一次是C-s 把你带入了 Incremental Search Mode ， 第二次的 C-s 表示查找上一次查过的东西。 C-r 类似，只不过方向相反。&lt;/p&gt;     &lt;/blockquote&gt;   &lt;/li&gt;    &lt;li&gt;C-w 查找光标除所在的单词      &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;       &lt;p&gt;例如， 你可以输入 C-r 然后马上输入 C-w ，光标所在位置的单词就自动变成了要查找的内容。&lt;/p&gt;     &lt;/blockquote&gt;      &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;       &lt;p&gt;多次输入 C-w 后面的单词就会一个一个的变成了查找内容一部分。&lt;/p&gt;     &lt;/blockquote&gt;      &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;       &lt;p&gt;C-w 还可以和上面介绍的 C-s C-r 配合使用。C-s 进入 Incremental Search Mode. 然后输入 void f 然后光标会停留在一个 void f 的单词上，也许是 void far ，然后用 C-s 或者 C-r 找到某个 void f 的地方，然后 C-w 就可以把 f 后面的单词补全了。&lt;/p&gt;     &lt;/blockquote&gt;   &lt;/li&gt;    &lt;li&gt;C-y 把光标所在位置到行尾的部分作为查找内容      &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;       &lt;p&gt;和 C-w 类似，只不过输入的不是一个单词，而是整整一行。&lt;/p&gt;     &lt;/blockquote&gt;   &lt;/li&gt;    &lt;li&gt;M-y 把 kill ring 中的东西输入为当前要查找的内容 &lt;/li&gt;    &lt;li&gt;M-c 切换大小写敏感。 &lt;/li&gt;    &lt;li&gt;M-r 切换是普通查找还是正则表达式查找。 &lt;/li&gt;    &lt;li&gt;M-e 编辑要查找的内容      &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;       &lt;p&gt;Incremental Search 会随着用户的输入不断的改变光标的位置，有的时候很讨厌，那么就可以 M-e 编辑要查找的内容，然后按 Enter 回到 Incremetal Search 。&lt;/p&gt;     &lt;/blockquote&gt;   &lt;/li&gt;    &lt;li&gt;M-n M-p 浏览查找历史纪录      &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;       &lt;p&gt;可以查找以前查找过的内容。&lt;/p&gt;     &lt;/blockquote&gt;   &lt;/li&gt;    &lt;li&gt;C-q C-j 查找多行文字。      &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;       &lt;p&gt;如果你要的查找的内容是多行文字，也就是说，查找内容中含有换行字符 C-j 但是， Enter 键又作为结束查找的操作，一按 Enter 就退出了查找模式了。那么 C-q C-j 可以解决这个问题。 可以查看 &lt;a href="http://emacser.com/ann77/Emacs/EmacsInputControlCharacter.html"&gt;如何 输入特殊的控制字符&lt;/a&gt; 。&lt;/p&gt;     &lt;/blockquote&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;用 Nonincremental Search 查找&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;如果不习惯 Incremetal Search 的方式，那么可以 C-s &amp;lt;RET&amp;gt; ，也就是按了 C-s 之后，马上按一个回车，就用 Nonincremental Search 的方式查找，这种查找方式和普通的编辑器几乎一样。&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;使用 moccur 在所有打开的文件内查找&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;本来 M-x occur 可以在一个 buffer 的查找某一个正则表达式。 moccur 提供更加强大的功能。安装了 moccur 之后 ，如果进入 incremetal 查找功能，除了上面介绍的一些功能，有多了两个新的功能。下面的操作都是先按 C-s 或者 C-r 后 进入 Incremental Search Mode 之后的操作。&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;M-o, 小写的 o , 列出来当前 buffer 内的所有查找内容 &lt;/li&gt;    &lt;li&gt;M-O, 大写的 O , 列出来所有打开的 buffer 中出现的查找内容。      &lt;p&gt;安装 moccur 的方法。下载 color-moccur.el， 然后按照文件头的提示或者参考 &lt;a href="http://emacser.com/ann77/Emacs/EmacsInstallPackege.html"&gt;Emacs 安装一个扩展包的方法&lt;/a&gt;&lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;在多个文件中查找&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;find-dired&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;运行外部命令 find , 产生文件列表，然后进入 dired 模式。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;find-grep-dired&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;运行外部命令 find，用 grep 过滤文件， ls 产生目录列表，然后进入 dired 模式，这样列出所有包含某些字符的文件列表。可以使用 dired-do-query-replace-regexp 在文件列表中查找并替换。可以递归所有子目录。可以用各种条件过滤文件，详细可以查看 find 命令的帮助。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;grep&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;在当前目录中查找指定的 regexp 。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;grep-find&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;运行 find , grep ，然后产生类似于 compile 的结果，可以查看哪些文件在什么地方包含了匹配了指定的 regexp 。用 C-x ` 浏览结果。可以递归所有子目录。，详细可以查看 find 命令的帮助。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;dired-do-query-replace-regexp&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;在任何 dired 模式下，对于所有带有标记的文件进行查找替换。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;替换&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;在 transient mode 下，如果 region 是激活状态下，那么就调用 query-replace-selection , 这个函数和 query-replace 几乎完全一样，不同的是， query-replace-selection 用当前选择的 region 作为被替换的部分，而不是等用户输入。&lt;/p&gt;  &lt;pre&gt;(defun query-replace-selection (to-string &amp;amp;optional delimited start end)&lt;br /&gt;  &amp;quot;query reqlace the current selection in transient mark mode.&amp;quot;&lt;br /&gt;  (interactive (list&lt;br /&gt;                (read-from-minibuffer (format &amp;quot;Query replace %s with: &amp;quot;&lt;br /&gt;                                              (buffer-substring (point) (mark)))&lt;br /&gt;                                      nil nil nil&lt;br /&gt;                                      query-replace-to-history-variable&lt;br /&gt;                                      (buffer-substring (point) (mark))&lt;br /&gt;                                      t)&lt;br /&gt;                nil nil nil&lt;br /&gt;                ))&lt;br /&gt;  (perform-replace (buffer-substring (point) (mark)) to-string t nil delimited nil nil start end))&lt;br /&gt;(wcy-define-2bind-transient-mode&lt;br /&gt; wcy-query-replace-or-query-replace-selection&lt;br /&gt; 'query-replace-selection&lt;br /&gt; 'query-replace)&lt;br /&gt;(global-set-key (kbd &amp;quot;M-%&amp;quot;) 'wcy-query-replace-or-query-replace-selection)&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;wcy-define-2bind-transient-mode 的定义参见 &lt;a href="http://emacser.com/ann77/Emacs/EmacsEditTips.html"&gt;其他编辑技巧&lt;/a&gt; 中的 C-w 部分。&lt;/p&gt;&#xD;
&#xD;
&lt;pre&gt;;; 在 C-s 进入 incremental search 的时候， 按 M-i ， 替换当前查找内容&lt;br /&gt;(define-key isearch-mode-map (kbd &amp;quot;M-i&amp;quot;) 'isearch-query-replace-current)&lt;br /&gt;(defun isearch-query-replace-current ()&lt;br /&gt;  &amp;quot;replace current searching string.&amp;quot;&lt;br /&gt;  (interactive)&lt;br /&gt;  (let ((case-fold-search isearch-case-fold-search)&lt;br /&gt;        (from-string isearch-string))&lt;br /&gt;    (if (not isearch-success)&lt;br /&gt;        (message &amp;quot;search string not found&amp;quot;)&lt;br /&gt;      (progn&lt;br /&gt;       (isearch-exit)&lt;br /&gt;       (goto-char (min (point) isearch-other-end)))&lt;br /&gt;      ;;(isearch-abort)&lt;br /&gt;      (perform-replace&lt;br /&gt;       from-string&lt;br /&gt;       (read-from-minibuffer (format &amp;quot;Query replace %s with: &amp;quot;&lt;br /&gt;                                     from-string)&lt;br /&gt;                             from-string nil nil&lt;br /&gt;                             query-replace-to-history-variable&lt;br /&gt;                             from-string&lt;br /&gt;                             t)&lt;br /&gt;       t ; query flag&lt;br /&gt;       isearch-regexp&lt;br /&gt;       nil))))&lt;/pre&gt;&#xD;
&#xD;
&lt;pre&gt;;; 进入 incremental search mode 之后，有些命令可以根据光标所在位置补全要查找内容，&lt;br /&gt;;; 例如 C-w 可以补全一个词。但是如果按多了 C-w 就不能回退了，而且不能精确定位，&lt;br /&gt;;; 下面的键绑定重新定义了一些常用的光标移动命令，根据光标移动，自动补齐查找内容，&lt;br /&gt;;; 例如 C-f 自动补齐光标处的一个字符。&lt;br /&gt;(define-key isearch-mode-map (kbd &amp;quot;C-e&amp;quot;) 'isearch-move-point)&lt;br /&gt;(define-key isearch-mode-map (kbd &amp;quot;C-a&amp;quot;) 'isearch-move-point)&lt;br /&gt;(define-key isearch-mode-map (kbd &amp;quot;M-e&amp;quot;) 'isearch-move-point)&lt;br /&gt;(define-key isearch-mode-map (kbd &amp;quot;M-a&amp;quot;) 'isearch-move-point)&lt;br /&gt;(define-key isearch-mode-map (kbd &amp;quot;C-M-e&amp;quot;) 'isearch-move-point)&lt;br /&gt;(define-key isearch-mode-map (kbd &amp;quot;C-M-a&amp;quot;) 'isearch-move-point)&lt;br /&gt;(define-key isearch-mode-map (kbd &amp;quot;C-f&amp;quot;) 'isearch-move-point)&lt;br /&gt;(define-key isearch-mode-map (kbd &amp;quot;C-b&amp;quot;) 'isearch-move-point)&lt;br /&gt;(define-key isearch-mode-map (kbd &amp;quot;M-f&amp;quot;) 'isearch-move-point)&lt;br /&gt;(define-key isearch-mode-map (kbd &amp;quot;M-b&amp;quot;) 'isearch-move-point)&lt;br /&gt;(define-key isearch-mode-map (kbd &amp;quot;C-M-f&amp;quot;) 'isearch-move-point)&lt;br /&gt;(define-key isearch-mode-map (kbd &amp;quot;C-M-b&amp;quot;) 'isearch-move-point)&lt;br /&gt;(defun isearch-move-point ()&lt;br /&gt;  (interactive)&lt;br /&gt;  (when isearch-success&lt;br /&gt;    (save-excursion&lt;br /&gt;      (let ((overriding-terminal-local-map nil)&lt;br /&gt;            (old-point (or isearch-other-end (point))))&lt;br /&gt;        (call-interactively (key-binding (this-command-keys)))&lt;br /&gt;        (setq isearch-string (buffer-substring-no-properties  old-point&lt;br /&gt;                                                              (point))&lt;br /&gt;              isearch-message&lt;br /&gt;              (mapconcat 'isearch-text-char-description&lt;br /&gt;                         isearch-string &amp;quot;&amp;quot;)&lt;br /&gt;              ;; Don't move cursor in reverse search.&lt;br /&gt;              isearch-forward (cond&lt;br /&gt;                               ((&amp;lt; old-point (point)) t)&lt;br /&gt;                               ((&amp;gt; old-point (point)) nil)&lt;br /&gt;                               ((= old-point (point)) isearch-forward))&lt;br /&gt;              )))&lt;br /&gt;    (isearch-search-and-update)))&lt;/pre&gt;&lt;img src="http://www.cnblogs.com/wuhen/aggbug/2227366.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wuhen/archive/2011/10/28/2227366.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wuhen/archive/2011/07/28/2119460.html</id><title type="text">JAVA中的反射机制</title><summary type="text">JAVA反射机制是在运行状态中，对于任意一个类，都能够知道这个类的所有属性和方法；对于任意一个对象，都能够调用它的任意一个方法；这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 Java反射机制主要提供了以下功能： 在运行时分析类的能力，判断任意对象所属类，类中有哪些方法，有哪些成员变量；在运行时控查对象，比如，只写一个toString()方法供所有的类使用；实现通用数组...</summary><published>2011-07-28T05:45:00Z</published><updated>2011-07-28T05:45:00Z</updated><author><name>JOY</name><uri>http://www.cnblogs.com/wuhen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wuhen/archive/2011/07/28/2119460.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wuhen/archive/2011/07/28/2119460.html"/><content type="html">&lt;p&gt;JAVA反射机制是在运行状态中，对于任意一个类，都能够知道这个类的所有属性和方法；对于任意一个对象，都能够调用它的任意一个方法；这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。   &lt;br /&gt;Java反射机制主要提供了以下功能： 在运行时分析类的能力，判断任意对象所属类，类中有哪些方法，有哪些成员变量；在运行时控查对象，比如，只写一个toString()方法供所有的类使用；实现通用数组操作代码的功能。&lt;/p&gt;  &lt;p&gt;1. 得到某个对象的属性   &lt;br /&gt;1 public Object getProperty(Object owner, String fieldName) throws Exception {    &lt;br /&gt;2&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Class ownerClass = owner.getClass();    &lt;br /&gt;3    &lt;br /&gt;4&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Field field = ownerClass.getField(fieldName);    &lt;br /&gt;5    &lt;br /&gt;6&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Object property = field.get(owner);    &lt;br /&gt;7    &lt;br /&gt;8&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return property;    &lt;br /&gt;9 }    &lt;br /&gt;Class ownerClass = owner.getClass()：得到该对象的Class。    &lt;br /&gt;Field field = ownerClass.getField(fieldName)：通过Class得到类声明的属性。    &lt;br /&gt;Object property = field.get(owner)：通过对象得到该属性的实例，如果这个属性是非公有的，这里会报IllegalAccessException。    &lt;br /&gt;2. 得到某个类的静态属性    &lt;br /&gt;1 public Object getStaticProperty(String className, String fieldName)    &lt;br /&gt;2&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throws Exception {    &lt;br /&gt;3&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Class ownerClass = Class.forName(className);    &lt;br /&gt;4    &lt;br /&gt;5&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Field field = ownerClass.getField(fieldName);    &lt;br /&gt;6    &lt;br /&gt;7&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Object property = field.get(ownerClass);    &lt;br /&gt;8    &lt;br /&gt;9&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return property;    &lt;br /&gt;10 }    &lt;br /&gt;Class ownerClass = Class.forName(className) ：首先得到这个类的Class。    &lt;br /&gt;Field field = ownerClass.getField(fieldName)：和上面一样，通过Class得到类声明的属性。    &lt;br /&gt;Object property = field.get(ownerClass) ：这里和上面有些不同，因为该属性是静态的，所以直接从类的Class里取。    &lt;br /&gt;3. 执行某对象的方法    &lt;br /&gt;1 public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {    &lt;br /&gt;2    &lt;br /&gt;3&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Class ownerClass = owner.getClass();    &lt;br /&gt;4    &lt;br /&gt;5&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Class[] argsClass = new Class[args.length];    &lt;br /&gt;6    &lt;br /&gt;7&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (int i = 0, j = args.length; i &amp;lt; j; i++) {    &lt;br /&gt;8&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; argsClass[i] = args[i].getClass();    &lt;br /&gt;9&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;10    &lt;br /&gt;11&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Method method = ownerClass.getMethod(methodName, argsClass);    &lt;br /&gt;12    &lt;br /&gt;13&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return method.invoke(owner, args);    &lt;br /&gt;14 }    &lt;br /&gt;Class owner_class = owner.getClass() ：首先还是必须得到这个对象的Class。    &lt;br /&gt;5～9行：配置参数的Class数组，作为寻找Method的条件。    &lt;br /&gt;Method method = ownerClass.getMethod(methodName, argsClass)：通过Method名和参数的Class数组得到要执行的Method。    &lt;br /&gt;method.invoke(owner, args)：执行该Method，invoke方法的参数是执行这个方法的对象，和参数数组。返回值是Object，也既是该方法的返回值。    &lt;br /&gt;4. 执行某个类的静态方法    &lt;br /&gt;1 public Object invokeStaticMethod(String className, String methodName,    &lt;br /&gt;2&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Object[] args) throws Exception {    &lt;br /&gt;3&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Class ownerClass = Class.forName(className);    &lt;br /&gt;4    &lt;br /&gt;5&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Class[] argsClass = new Class[args.length];    &lt;br /&gt;6    &lt;br /&gt;7&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (int i = 0, j = args.length; i &amp;lt; j; i++) {    &lt;br /&gt;8&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; argsClass[i] = args[i].getClass();    &lt;br /&gt;9&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;10    &lt;br /&gt;11&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Method method = ownerClass.getMethod(methodName, argsClass);    &lt;br /&gt;12    &lt;br /&gt;13&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return method.invoke(null, args);    &lt;br /&gt;14 }    &lt;br /&gt;基本的原理和实例3相同，不同点是最后一行，invoke的一个参数是null，因为这是静态方法，不需要借助实例运行。    &lt;br /&gt;5. 新建实例    &lt;br /&gt;1    &lt;br /&gt;2 public Object newInstance(String className, Object[] args) throws Exception {    &lt;br /&gt;3&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Class newoneClass = Class.forName(className);    &lt;br /&gt;4    &lt;br /&gt;5&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Class[] argsClass = new Class[args.length];    &lt;br /&gt;6    &lt;br /&gt;7&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (int i = 0, j = args.length; i &amp;lt; j; i++) {    &lt;br /&gt;8&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; argsClass[i] = args[i].getClass();    &lt;br /&gt;9&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;10    &lt;br /&gt;11&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Constructor cons = newoneClass.getConstructor(argsClass);    &lt;br /&gt;12    &lt;br /&gt;13&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return cons.newInstance(args);    &lt;br /&gt;14    &lt;br /&gt;15 }    &lt;br /&gt;这里说的方法是执行带参数的构造函数来新建实例的方法。如果不需要参数，可以直接使用newoneClass.newInstance()来实现。    &lt;br /&gt;Class newoneClass = Class.forName(className)：第一步，得到要构造的实例的Class。    &lt;br /&gt;第5～第9行：得到参数的Class数组。    &lt;br /&gt;Constructor cons = newoneClass.getConstructor(argsClass)：得到构造子。    &lt;br /&gt;cons.newInstance(args)：新建实例。    &lt;br /&gt;6. 判断是否为某个类的实例    &lt;br /&gt;1 public boolean isInstance(Object obj, Class cls) {    &lt;br /&gt;2&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return cls.isInstance(obj);    &lt;br /&gt;3 }    &lt;br /&gt;7. 得到数组中的某个元素    &lt;br /&gt;1 public Object getByArray(Object array, int index) {    &lt;br /&gt;2&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return Array.get(array,index);    &lt;br /&gt;3 }    &lt;br /&gt;其中，反射机制最重要的部分是允许你检查类的结构。java.lang.reflect包中的三个类Field,Method,Constructor类分别描述类的字段，方法和构造器，它们都有一个getName方法，用来返回相应条目的名称。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/wuhen/aggbug/2119460.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wuhen/archive/2011/07/28/2119460.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wuhen/archive/2011/07/28/2119451.html</id><title type="text">java中读取配置文件信息的六种方法</title><summary type="text">1。使用Java.util.Properties类的load()方法 示例： InputStream in = lnew BufferedInputStream(new FileInputStream(name)); Properties p = new Properties(); p.load(in); 2。使用java.util.ResourceBundle类的getBundle()方法 示例...</summary><published>2011-07-28T05:34:00Z</published><updated>2011-07-28T05:34:00Z</updated><author><name>JOY</name><uri>http://www.cnblogs.com/wuhen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wuhen/archive/2011/07/28/2119451.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wuhen/archive/2011/07/28/2119451.html"/><content type="html">&lt;p&gt;1。使用Java.util.Properties类的load()方法    &lt;br /&gt;示例： InputStream in = lnew BufferedInputStream(new FileInputStream(name));     &lt;br /&gt;Properties p = new Properties();     &lt;br /&gt;p.load(in); &lt;/p&gt;  &lt;p&gt;2。使用java.util.ResourceBundle类的getBundle()方法    &lt;br /&gt;示例： ResourceBundle rb = ResourceBundle.getBundle(name, Locale.getDefault()); &lt;/p&gt;  &lt;p&gt;3。使用java.util.PropertyResourceBundle类的构造函数    &lt;br /&gt;示例： InputStream in = new BufferedInputStream(new FileInputStream(name));     &lt;br /&gt;ResourceBundle rb = new PropertyResourceBundle(in); &lt;/p&gt;  &lt;p&gt;4。使用class变量的getResourceAsStream()方法    &lt;br /&gt;示例： InputStream in = JProperties.class.getResourceAsStream(name);     &lt;br /&gt;Properties p = new Properties();     &lt;br /&gt;p.load(in); &lt;/p&gt;  &lt;p&gt;5。使用class.getClassLoader()所得到的java.lang.ClassLoader的getResourceAsStream()方法    &lt;br /&gt;示例： InputStream in = JProperties.class.getClassLoader().getResourceAsStream(name);     &lt;br /&gt;Properties p = new Properties();     &lt;br /&gt;p.load(in); &lt;/p&gt;  &lt;p&gt;6。使用java.lang.ClassLoader类的getSystemResourceAsStream()静态方法&lt;/p&gt;&lt;img src="http://www.cnblogs.com/wuhen/aggbug/2119451.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wuhen/archive/2011/07/28/2119451.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wuhen/archive/2011/07/28/2119449.html</id><title type="text">JAVA深入探索－参数传递</title><summary type="text">按值传参 JAVA中的参数传递只存在传值方式一种，但也有传引用的概念。 这是java参数传递的核心说明。java不像C/C＋＋那样可以通过指针符或地址符来区分传值还是传引用，因为它只有一种参数传递的方式，那就是传值方式。这对初学java的人来说很难理解，通过下面的例子可以看出真正的传值在java中是如何实现的。 public static void swap(int a,int b){//交换两个...</summary><published>2011-07-28T05:31:00Z</published><updated>2011-07-28T05:31:00Z</updated><author><name>JOY</name><uri>http://www.cnblogs.com/wuhen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wuhen/archive/2011/07/28/2119449.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wuhen/archive/2011/07/28/2119449.html"/><content type="html">&lt;p&gt;&lt;strong&gt;按值传参      &lt;br /&gt;&lt;/strong&gt;JAVA中的参数传递只存在传值方式一种，但也有传引用的概念。     &lt;br /&gt;这是java参数传递的核心说明。java不像C/C＋＋那样可以通过指针符或地址符来区分传值还是传引用，因为它只有一种参数传递的方式，那就是传值方式。这对初学java的人来说很难理解，通过下面的例子可以看出真正的传值在java中是如何实现的。     &lt;br /&gt;public static void swap(int a,int b){//交换两个变量的值     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int temp = a;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; a = b;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; b = temp;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.out.println(&amp;quot;swap:&amp;quot;+a+&amp;quot;,&amp;quot;+b);     &lt;br /&gt;}     &lt;br /&gt;......     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int a = 3;     &lt;br /&gt;int b = 5;     &lt;br /&gt;&amp;#160;&amp;#160; swap(a,b);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.out.println(a +&amp;quot; &amp;quot;+b);//3 5     &lt;br /&gt;......     &lt;br /&gt;程序打印结果：     &lt;br /&gt;swap:5,3     &lt;br /&gt;3&amp;#160;&amp;#160; 5     &lt;br /&gt;由程序的结果可以看到，事实上，经过交换的方法swap()之后，主程序中的变量a,b的值并没有被改变。     &lt;br /&gt;分析过程如下：在调用swap()方法的时候，程序把a、b的副本送到swap()方法中的变量a、b中去，而主程序中的变量a、b中的内容并没有被改变。所以就会出现上面的结果。     &lt;br /&gt;其实，不仅是简单的数据类型如此 ，如果传递的参数是一个对象，也会出现这样的结果，这与简单数据类型的情况类似，都可以划为按值传参一类中。我们看下面的程序及其分析过程：     &lt;br /&gt;public class User{     &lt;br /&gt;static void swap(User user1,User user2){     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; User user = user1;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; user1 = user2;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; user2 = user;     &lt;br /&gt;}     &lt;br /&gt;public static void main(String[]args){     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; User user3 = new User(&amp;quot;ding&amp;quot;, 20);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; User user4 = new User(&amp;quot;zhao&amp;quot;, 18);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; swap(user3, user4);&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160; /*进行函数swap(user1,user2)的调用，但是并不会真正把user3和user4所指向的内存空间     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; *进行交换，只是在调用的时候，会把user3中存放的内存地址复制一份传给user1,把user4中存放的     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; *内存地址复制一份传给user2，相当于只是给user1和user2了一个副本，而真正的对象     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; *user3和user4并没有在swap()函数中被触及。所以函数处理的结果是使user1和user2所指向的内存空间     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; *进行交换，而user3和user4中的存放内容仍是原来的内容。*/     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.out.println(user3.username + &amp;quot;&amp;#160;&amp;#160; &amp;quot; +user3.age);//ding&amp;#160;&amp;#160; 20     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.out.println(user4.username + &amp;quot;&amp;#160;&amp;#160; &amp;quot; +user4.age);//zhao&amp;#160;&amp;#160; 18     &lt;br /&gt;｝     &lt;br /&gt;程序的运行结果：     &lt;br /&gt;ding&amp;#160;&amp;#160; 20     &lt;br /&gt;zhao&amp;#160;&amp;#160; 18&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;传递引用&lt;/strong&gt;     &lt;br /&gt;既然说java中的参数传递只有by value一种，为什么还要说传递引用呢？实际上，java与C＋＋一样，同样存在对一个对象的引用进行传递的问题，但java中的引用传递机制是，把原来变量中保存的内存地址传递作为一个参数进行传递，而不是直接把引用传过去。所以在java中仍把它称做按值传参。     &lt;br /&gt;同样采用例子的方式来解释java中的引用传递的问题:     &lt;br /&gt;.......     &lt;br /&gt;public static&amp;#160;&amp;#160; void changAge(User user){     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; User temp = user;//这时，temp中存放了和原对象相同的内存地址     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; temp.age = temp.age + 20;//对user的年龄进行增加的操作，     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /*是对temp所指向的内存空间中的值直接进行操作，所以会对原对象的值造成影响。就相当于是传递了原对象的引用*/     &lt;br /&gt;}     &lt;br /&gt;......     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; User user = new User(&amp;quot;li&amp;quot;,25);//仍采用上例中的User     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; changAge(user);//改变user的年龄     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.out.println(user.age);//45     &lt;br /&gt;.......     &lt;br /&gt;有了上面例子的说明，我们可能就会想到，如果我们的程序中私有变量是一个对象类型的变量时，在主程序中有了这个私有变量的拷贝，是不是就有可能在修改这个拷贝时不小心把原来的私有变量的值也给改变了呢？     &lt;br /&gt;我们来看下面的例子：     &lt;br /&gt;class Test{     &lt;br /&gt;private Date date=new Date();     &lt;br /&gt;public Date getDate(){     &lt;br /&gt;return date;     &lt;br /&gt;}     &lt;br /&gt;public static void main(String[] args){     &lt;br /&gt;Test tt=new Test();     &lt;br /&gt;Date myDate=tt.getDate();//返回了一个私有变量的拷贝     &lt;br /&gt;System.out.println(myDate);     &lt;br /&gt;myDate.setTime(new Date().getTime()-(long)(10*365.25*24*3600*1000));//对新产生的拷贝进行修改     &lt;br /&gt;System.out.println(tt.getDate());     &lt;br /&gt;System.out.println(myDate);     &lt;br /&gt;}     &lt;br /&gt;}     &lt;br /&gt;先来猜一下运行的结果,是前两句输出一样呢还是后两句输出一样(最后一句输出比第一句输出的日期早十年)?很多人都会说是前两句输出一样.实际上,你会惊奇地发现，输出结果显示后两者输出一样，私有变量在程序外部被改变了，程序的封装性遭到了破坏。     &lt;br /&gt;出错的原因很微妙.因为myDate和tt指向了同一个对象，对myDate的引用更改方法自动地改变了这个类的私有方法状态。经过测试可以知道，如果myDate被重新赋值（比如myDate=new Date())，就不会出现上面的结果。但是现在的这个程序，私有变量还是在程序外部被改变了。     &lt;br /&gt;如果需要返回一个指向可变对象的引用，我们就需要克隆它，这样就不会导致上面的私有变量被更改。     &lt;br /&gt;上面程序就应更改为：return (Date)date.clone();就可以&lt;strong&gt;防止私有变量被修改&lt;/strong&gt;的麻烦了。     &lt;br /&gt;再来执行上面的程序，就会出现不一样的结果。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/wuhen/aggbug/2119449.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wuhen/archive/2011/07/28/2119449.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wuhen/archive/2011/07/28/2119413.html</id><title type="text">使用JNI技术实现JAVA程序调用dll</title><summary type="text">JAVA的跨平台的特性深受java程序员们的喜爱,但正是由于它为了实现跨平台的目的,使得它和本地机器的各种内部联系变得很少,大大约束了它的功能,比如与一些硬件设备通信,往往要花费很大的精力去设计流程编写代码去管理设备端口,而且有一些设备厂商提供的硬件接口已经经过一定的封装和处理,不能直接使用java程序通过端口和设备通信,这种情况下就得考虑使用java程序去调用比较擅长同系统打交道的第三方程序,从...</summary><published>2011-07-28T04:37:00Z</published><updated>2011-07-28T04:37:00Z</updated><author><name>JOY</name><uri>http://www.cnblogs.com/wuhen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wuhen/archive/2011/07/28/2119413.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wuhen/archive/2011/07/28/2119413.html"/><content type="html">&lt;p&gt;JAVA的跨平台的特性深受java程序员们的喜爱,但正是由于它为了实现跨平台的目的,使得它和本地机器的各种内部联系变得很少,大大约束了它的功能,比如与一些硬件设备通信,往往要花费很大的精力去设计流程编写代码去管理设备端口,而且有一些设备厂商提供的硬件接口已经经过一定的封装和处理,不能直接使用java程序通过端口和设备通信,这种情况下就得考虑使用java程序去调用比较擅长同系统打交道的第三方程序,从1.1版本开始的JDK提供了解决这个问题的技术标准:JNI技术.    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; JNI是Java Native Interface(Java本地接口)的缩写,本地是相对于java程序来说的,指直接运行在操作系统之上,与操作系统直接交互的程序.从1.1版本的JDK开始,JNI就作为标准平台的一部分发行.在JNI出现的初期是为了Java程序与本地已编译语言,尤其是C和C++的互操作而设计的,后来经过扩展也可以与c和c++之外的语言编写的程序交互,例如Delphi程序.     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 使用JNI技术固然增强了java程序的性能和功能,但是它也破坏了java的跨平台的优点,影响程序的可移植性和安全性,例如由于其他语言(如C/C++)可能能够随意地分配对象/占用内存,Java的指针安全性得不到保证.但在有些情况下,使用JNI是可以接受的,甚至是必须的,例如上面提到的使用java程序调用硬件厂商提供的类库同设备通信等,目前市场上的许多读卡器设备就是这种情况.在这必须使用JNI的情况下,尽量把所有本地方法都封装在单个类中,这个类调用单个的本地库文件,并保证对于每种目标操作系统,都可以用特定于适当平台的版本替换这个文件,这样使用JNI得到的要比失去的多很多.     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 现在开始讨论上面提到的问题,一般设备商会提供两种类型的类库文件,windows系统的会包含.dll/.h/.lib文件,而linux系统的会包含.so/.a文件,这里只讨论windows系统下的c/c++编译的dll文件调用方法.     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 我把设备商提供的dll文件称之为第三方dll文件,之所以说第三方,是因为JNI直接调用的是按它的标准使用c/c++语言编译的dll文件,这个文件是客户程序员按照设备商提供的.h文件中的列出的方法编写的dll文件,我称之为第二方dll文件,真正调用设备商提供的dll文件的其实就是这个第二方dll文件.到这里,解决问题的思路已经产生了,大慨分可以分为三步:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1&amp;gt;编写一个java类,这个类包含的方法是按照设备商提供的.h文件经过变形/转换处理过的,并且必须使用native定义.这个地方需要注意的问题是java程序中定义的方法不必追求和厂商提供的头文件列出的方法清单中的方法具有相同的名字/返回值/参数,因为一些参数类型如指针等在java中没法模拟,只要能保证这个方法能实现原dll文件中的方法提供的功能就行了;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2&amp;gt;按JNI的规则使用c/c++语言编写一个dll程序;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 3&amp;gt;按dll调用dll的规则在自己编写的dll程序里面调用厂商提供的dll程序中定义的方法. &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 我之前为了给一个java项目添加IC卡读写功能,曾经查了很多资料发现查到的资料都是只说到第二步,所以剩下的就只好自己动手研究了.下面结合具体的代码来按这三个步骤分析. &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1&amp;gt;假设厂商提供的.h文件中定义了一个我们需要的方法:    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; __int16 __stdcall readData( HANDLE icdev, __int16 offset, __int16 len, unsigned char *data_buffer );     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; a.__int16定义了一个不依赖于具体的硬件和软件环境,在任何环境下都占16 bit的整型数据(java中的int类型是32 bit),这个数据类型是vc++中特定的数据类型,所以我自己做的dll也是用的vc++来编译.     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; b.__stdcall表示这个函数可以被其它程序调用,vc++编译的DLL欲被其他语言编写的程序调用,应将函数的调用方式声明为__stdcall方式,WINAPI都采用这种方式.c/c++语言默认的调用方式是__cdecl,所以在自己做可被java程序调用的dll时一定要加上__stdcall的声明,否则在java程序执行时会报类型不匹配的错误.     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c.HANDLE icdev是windows操作系统中的一个概念,属于win32的一种数据类型,代表一个核心对象在某一个进程中的唯一索引,不是指针,在知道这个索引代表的对象类型时可以强制转换成此类型的数据.     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; 这些知识都属于win32编程的范围,更为详细的win32资料可以查阅相关的文档.     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; 这个方法的原始含义是通过设备初始时产生的设备标志号icdev,读取从某字符串在内存空间中的相对超始位置offset开始的共len个字符,并存放到data_buffer指向的无符号字符类型的内存空间中,并返回一个16 bit的整型值来标志这次的读设备是否成功,这里真正需要的是unsigned char *这个指针指向的地址存放的数据,而java中没有指针类型,所以可以考虑定义一个返回字符串类型的java方法,原方法中返回的整型值也可以按经过一定的规则处理按字符串类型传出,由于HANDLE是一个类型于java中的Ojbect类型的数据,可以把它当作int类型处理,这样java程序中的方法定义就已经形成了:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; String readData( int icdev, int offset, int len );     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; 声明这个方法的时候要加上native关键字,表明这是一个与本地方法通信的java方法,同时为了安全起见,此文方法要对其它类隐藏,使用private声明,再另外写一个public方法去调用它,同时要在这个类中把本地文件加载进来,最终的代码如下: &lt;/p&gt;  &lt;p&gt;package test; &lt;/p&gt;  &lt;p&gt;public class LinkDll    &lt;br /&gt;{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; //从指定地址读数据     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; private native String readData( int icdev, int offset, int len );     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public String readData( int icdev, int offset, int len )     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return this.readDataTemp( icdev, offset, len );     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; static&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.loadLibrary( &amp;quot;TestDll&amp;quot; );//如果执行环境是linux这里加载的是SO文件,如果是windows环境这里加载的是dll文件     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;2&amp;gt;使用JDK的javah命令为这个类生成一个包含类中的方法定义的.h文件,可进入到class文件包的根目录下(只要是在classpath参数中的路径即可),使用javah命令的时候要加上包名javah test.LinkDll,命令成功后生成一个名为test_LinkDll.h的头文件.    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; 文件内容如下: &lt;/p&gt;  &lt;p&gt;/* DO NOT EDIT THIS FILE - it is machine generated*/    &lt;br /&gt;#include &amp;lt;jni.h&amp;gt; &lt;/p&gt;  &lt;p&gt;/* Header for class test_LinkDll */    &lt;br /&gt;#ifndef _Included_test_LinkDll #define &lt;/p&gt;  &lt;p&gt;Included_test_LinkDll    &lt;br /&gt;#ifdef __cplusplus extern &amp;quot;C&amp;quot; { #endif     &lt;br /&gt;/*     &lt;br /&gt;* Class:&amp;#160;&amp;#160;&amp;#160;&amp;#160; test_LinkDll     &lt;br /&gt;* Method:&amp;#160;&amp;#160;&amp;#160; readDataTemp     &lt;br /&gt;* Signature: (III)Ljava/lang/String;     &lt;br /&gt;*/     &lt;br /&gt;JNIEXPORT jstring JNICALL Java_test_LinkDll_readDataTemp(JNIEnv *, jobject, jint, jint, jint);     &lt;br /&gt;#ifdef __cplusplus } #endif     &lt;br /&gt;#endif &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; 可以看出,JNI为了实现和dll文件的通信,已经按它的标准对方法名/参数类型/参数数目作了一定的处理,其中的JNIEnv*/jobjtct这两个参数是每个JNI方法固有的参数,javah命令负责按JNI标准为每个java方法加上这两个参数.JNIEnv是指向类型为JNIEnv_的一个特殊JNI数据结构的指针,当由C++编译器编译时JNIEnv_结构其实被定义为一个类,这个类中定义了很多内嵌函数,通过使用&amp;quot;-&amp;gt;&amp;quot;符号,可以很方便使用这些函数,如:    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; (env)-&amp;gt;NewString( jchar* c, jint len )     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; 可以从指针c指向的地址开始读取len个字符封装成一个JString类型的数据.     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; 其中的jchar对应于c/c++中的char,jint对应于c/c++中的len,JString对应于java中的String,通过查看jni.h可以看到这些数据类型其实都是根据java和c/c++中的数据类型对应关系使用typedef关键字重新定义的基本数据类型或结构体.     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; 具体的对应关系如下:     &lt;br /&gt;Java类型&amp;#160;&amp;#160;&amp;#160;&amp;#160; 本地类型&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 描述     &lt;br /&gt;boolean&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jboolean&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; C/C++8位整型     &lt;br /&gt;byte&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jbyte&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; C/C++带符号的8位整型     &lt;br /&gt;char&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jchar&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; C/C++无符号的16位整型     &lt;br /&gt;short&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jshort&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; C/C++带符号的16位整型     &lt;br /&gt;int&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jint&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; C/C++带符号的32位整型     &lt;br /&gt;long&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jlong&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; C/C++带符号的64位整型e     &lt;br /&gt;float&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jfloat&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; C/C++32位浮点型     &lt;br /&gt;double&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jdouble&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; C/C++64位浮点型     &lt;br /&gt;Object&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jobject&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 任何Java对象,或者没有对应java类型的对象     &lt;br /&gt;Class&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jclass&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Class对象     &lt;br /&gt;String&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jstring&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 字符串对象     &lt;br /&gt;Object[]&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jobjectArray&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 任何对象的数组     &lt;br /&gt;boolean[]&amp;#160;&amp;#160;&amp;#160; jbooleanArray&amp;#160;&amp;#160;&amp;#160;&amp;#160; 布尔型数组     &lt;br /&gt;byte[]&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jbyteArray&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 比特型数组     &lt;br /&gt;char[]&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jcharArray&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 字符型数组     &lt;br /&gt;short[]&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jshortArray&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 短整型数组     &lt;br /&gt;int[]&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jintArray&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 整型数组     &lt;br /&gt;long[]&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jlongArray&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 长整型数组     &lt;br /&gt;float[]&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jfloatArray&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 浮点型数组     &lt;br /&gt;double[]&amp;#160;&amp;#160;&amp;#160;&amp;#160; jdoubleArray&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 双浮点型数组     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; 更为详细的资料可以查阅JNI文档.     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; 需要注意的问题:test_LinkDll.h文件包含了jni.h文件; &lt;/p&gt;  &lt;p&gt;3&amp;gt;使用vc++ 6.0编写TestDll.dll文件,这个文件名是和java类中loadLibrary的名称一致.    &lt;br /&gt;a&amp;gt;使用vc++6.0 新建一个Win32 Dynamic-Link Library的工程文件,工程名指定为TestDll     &lt;br /&gt;b&amp;gt;把源代码文件和头文件使用&amp;quot;Add Fiels to Project&amp;quot;菜单加载到工程中,若使用c来编码,源码文件后缀名为.c,若使用c++来编码,源码文件扩展名为.cpp,这个一定要搞清楚,因为对于不同的语言,使用JNIEnv指针的方式是不同的.     &lt;br /&gt;c&amp;gt;在这个文件里调用设备商提供的dll文件,设备商一般提供三种文件:dll/lib/h,这里假设分别为A.dll/A.lib/A.h.     &lt;br /&gt;这个地方的调用分为动态调用和静态调用静态调用即是只要把被调用的dll文件放到path路径下,然后加载lib链接文件和.h头文件即可直接调用A.dll中的方法:     &lt;br /&gt;把设备商提供的A.h文件使用&amp;quot;Add Fiels to Project&amp;quot;菜单加载到这个工程中,同时在源代码文件中要把这个A.h文件使用include包含进来;     &lt;br /&gt;然后依次点击&amp;quot;Project-&amp;gt;settings&amp;quot;菜单,打开link选项卡,把A.lib添加到&amp;quot;Object/library modules&amp;quot;选项中.     &lt;br /&gt;具体的代码如下:     &lt;br /&gt;//读出数据,需要注意的是如果是c程序在调用JNI函数时必须在JNIEnv的变量名前加*,如(*env)-&amp;gt;xxx,如果是c++程序,则直接使用(env)-&amp;gt;xxx &lt;/p&gt;  &lt;p&gt;#include&amp;lt;WINDOWS.H&amp;gt;    &lt;br /&gt;#include&amp;lt;MALLOC.H&amp;gt;     &lt;br /&gt;#include&amp;lt;STDIO.H&amp;gt;     &lt;br /&gt;#include&amp;lt;jni.h&amp;gt;     &lt;br /&gt;#include &amp;quot;test_LinkDll.h&amp;quot;     &lt;br /&gt;#include &amp;quot;A.h&amp;quot; &lt;/p&gt;  &lt;p&gt;JNIEXPORT jstring JNICALL Java_test_LinkDll_readDataTemp( JNIEnv *env, jobject jo, jint ji_icdev, jint ji_len )    &lt;br /&gt;{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; //*************************基本数据声明与定义******************************     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; HANDLE H_icdev = (HANDLE)ji_icdev;//设备标志符     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; __int16 i16_len = (__int16)ji_len;//读出的数据长度,值为3,即3个HEX形式的字符     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; __int16 i16_result;//函数返回值     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; __int16 i16_coverResult;//字符转换函数的返回值     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int i_temp;//用于循环的中间变量     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jchar jca_result[3] = { 'e', 'r', 'r' };//当读数据错误时返回此字符串 &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; //无符号字符指针,指向的内存空间用于存放读出的HEX形式的数据字符串    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; unsigned char* uncp_hex_passward = (unsigned char*)malloc( i16_len );     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; //无符号字符指针,指向的内存空间存放从HEX形式转换为ASC形式的数据字符串     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; unsigned char* uncp_asc_passward = (unsigned char*)malloc( i16_len * 2 );     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; //java char指针,指向的内存空间存放从存放ASC形式数据字符串空间读出的数据字符串     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; jchar *jcp_data = (jchar*)malloc(i16_len*2+1);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; //java String,存放从java char数组生成的String字符串,并返回给调用者     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; jstring js_data = 0; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; //*********读出3个HEX形式的数据字符到uncp_hex_data指定的内存空间**********    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; i16_result = readData( H_icdev, 6, uncp_hex_data );//这里直接调用的是设备商提供的原型方法. &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; if ( i16_result != 0 )    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;读卡错误......\n&amp;quot; );     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //这个地方调用JNI定义的方法NewString(jchar*,jint),把jchar字符串转换为JString类型数据,返回到java程序中即是String     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return (env)-&amp;gt;NewString( jca_result, 3 );     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;读数据成功......\n&amp;quot; ); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; //**************HEX形式的数据字符串转换为ASC形式的数据字符串**************    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; i16_coverResult = hex_asc( uncp_hex_data, uncp_asc_data, 3 );     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if ( i16_coverResult != 0 )     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;字符转换错误！\n&amp;quot; );     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return (env)-&amp;gt;NewString( jca_result, 3 );     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; //**********ASC char形式的数据字符串转换为jchar形式的数据字符串***********    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; for ( i_temp = 0; i_temp &amp;lt; i16_len; i_temp++ )&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jcp_data[i_temp] = uncp_hex_data[i_temp];     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; //******************jchar形式的数据字符串转换为java String****************     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; js_data = (env)-&amp;gt;NewString(jcp_data,i16_len);&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return js_data;     &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;动态调用,不需要lib文件,直接加载A.dll文件,并把其中的文件再次声明,代码如下:    &lt;br /&gt;#include&amp;lt;STDIO.H&amp;gt;     &lt;br /&gt;#include&amp;lt;WINDOWS.H&amp;gt;     &lt;br /&gt;#include &amp;quot;test_LinkDll.h&amp;quot; &lt;/p&gt;  &lt;p&gt;//首先声明一个临时方法,这个方法名可以随意定义,但参数同设备商提供的原型方法的参数保持一致.    &lt;br /&gt;typedef int ( *readDataTemp )( int, int, int, unsigned char * );//从指定地址读数据 &lt;/p&gt;  &lt;p&gt;//从指定地址读数据    &lt;br /&gt;JNIEXPORT jstring JNICALL Java_readDataTemp( JNIEnv *env, jobject jo, jint ji_icdev, jint ji_offset, jint ji_len )     &lt;br /&gt;{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int i_temp;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int i_result;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int i_icdev = (int)ji_icdev;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int i_offset = (int)ji_offset;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int i_len = (int)ji_len;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; jchar jca_result[5] = { 'e', 'r', 'r' };     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; unsigned char *uncp_data = (unsigned char*)malloc(i_len);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; jchar *jcp_data = (jchar *)malloc(i_len);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; jstring js_data = 0;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; //HINSTANCE是win32中同HANDLE类似的一种数据类型,意为Handle to an instance,常用来标记App实例,在这个地方首先把A.dll加载到内存空间,以一个App的形式存放,然后取 &lt;/p&gt;  &lt;p&gt;得它的instance交给dllhandle,以备其它资源使用.    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; HINSTANCE dllhandle;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; dllhandle = LoadLibrary( &amp;quot;A.dll&amp;quot; );     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; //这个地方首先定义一个已声明过的临时方法,此临时方法相当于一个结构体,它和设备商提供的原型方法具有相同的参数结构,可互相转换     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; readDataTemp readData; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; //使用win32的GetProcAddress方法取得A.dll中定义的名为readData的方法,并把这个方法转换为已被定义好的同结构的临时方法,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; //然后在下面的程序中,就可以使用这个临时方法了,使用这个临时方法在这时等同于使用A.dll中的原型方法.     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; readData = (readDataTemp) GetProcAddress( dllhandle, &amp;quot;readData&amp;quot; ); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; i_result = (*readData)( i_icdev, i_offset, i_len, uncp_data ); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; if ( i_result != 0 )    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf( &amp;quot;读数据失败......\n&amp;quot; );     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return (env)-&amp;gt;NewString( jca_result, 3 );     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; for ( i_temp = 0; i_temp &amp;lt; i_len; i_temp++ )    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jcp_data[i_temp] = uncp_data[i_temp];     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; js_data = (env)-&amp;gt;NewString( jcp_data, i_len ); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; return js_data;    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;4&amp;gt;以上即是一个java程序调用第三方dll文件的完整过程,当然,在整个过程的工作全部完成以后,就可以使用java类LinkDll中的public String radData( int, int, int )方法了,效果同直接使用c/c++调用这个设备商提供的A.dll文件中的readData方法几乎一样. &lt;/p&gt;  &lt;p&gt;总结:JNI技术确实是提高了java程序的执行效率,并且扩展了java程序的功能,但它也确确实实破坏了java程序的最重要的优点:平台无关性,所以除非必须(不得不)使用JNI技术,一般还是提倡写100%纯java的程序.根据自己的经验及查阅的一些资料,把可以使用JNI技术的情况罗列如下:    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; 1&amp;gt;需要直接操作物理设备,而没有相关的驱动程序,这时候我们可能需要用C甚至汇编语言来编写该设备的驱动,然后通过JNI调用;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; 2&amp;gt;涉及大量数学运算的部分,用java会带来些效率上的损失;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; 3&amp;gt;用java会产生系统难以支付的开销,如需要大量网络链接的场合;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; 4&amp;gt;存在大量可重用的c/c++代码,通过JNI可以减少开发工作量,避免重复开发.     &lt;br /&gt;另外,在利用JNI技术的时候要注意以下几点:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; 1&amp;gt;由于Java安全机制的限制,不要试图通过Jar文件的方式发布包含本地化方法的Applet到客户端;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; 2&amp;gt;注意内存管理问题,虽然在本地方法返回Java后将自动释放局部引用,但过多的局部引用将使虚拟机在执行本地方法时耗尽内存;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; 3&amp;gt;JNI技术不仅可以让java程序调用c/c++代码,也可以让c/c++代码调用java代码. &lt;/p&gt;  &lt;p&gt;注:有一个名叫Jawin开源项目实现了直接读取第三方dll文件,不用自己辛苦去手写一个起传值转换作用的dll文件,有兴趣的可以研究一下.但是我用的时候不太顺手,有很多规则限制,像自己写程序时可以随意定义返回值,随意转换类型,用这个包的话这些都是不可能的了,所以我的项目还没开始就把它抛弃了.&lt;/p&gt;&lt;img src="http://www.cnblogs.com/wuhen/aggbug/2119413.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wuhen/archive/2011/07/28/2119413.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wuhen/archive/2011/07/28/2119409.html</id><title type="text">J2EE 13种技术规范</title><summary type="text">J2EE平台由一整套服务（Services）、应用程序接口（APIs）和协议构成，它对开发基于Web的多层应用提供了功能支持，下面对J2EE中的13种技术规范进行简单的描述(限于篇幅，这里只能进行简单的描述): 1.JDBC(Java Database Connectivity): JDBC API为访问不同的数据库提供了一种统一的途径，象ODBC一样，JDBC对开发者屏蔽了一些细节问题，另外，J...</summary><published>2011-07-28T04:34:00Z</published><updated>2011-07-28T04:34:00Z</updated><author><name>JOY</name><uri>http://www.cnblogs.com/wuhen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wuhen/archive/2011/07/28/2119409.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wuhen/archive/2011/07/28/2119409.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;u&gt;J2EE&lt;/u&gt;&lt;/strong&gt;平台由一整套服务（Services）、应用程序接口（APIs）和协议构成，它对开发基于Web的多层应用提供了功能支持，下面对&lt;strong&gt;&lt;u&gt;J2EE&lt;/u&gt;&lt;/strong&gt;中的13种技术规范进行简单的描述(限于篇幅，这里只能进行简单的描述):    &lt;br /&gt;1.JDBC(Java Database Connectivity):    &lt;br /&gt;JDBC API为访问不同的数据库提供了一种统一的途径，象ODBC一样，JDBC对开发者屏蔽了一些细节问题，另外，JDCB对数据库的访问也具有平台无关性。    &lt;br /&gt;2.JNDI(Java Name and Directory Interface):    &lt;br /&gt;JNDI API被用于执行名字和目录服务。它提供了一致的模型来存取和操作企业级的资源如DNS和LDAP，本地文件系统，或应用服务器中的对象。    &lt;br /&gt;3.EJB(Enterprise JavaBean):    &lt;br /&gt;&lt;strong&gt;&lt;u&gt;J2EE&lt;/u&gt;&lt;/strong&gt;技术之所以赢得某体广泛重视的原因之一就是EJB。它们提供了一个框架来开发和实施分布式商务逻辑，由此很显著地简化了具有可伸缩性和高度复杂的企业级应用的开发。EJB规范定义了EJB组件在何时如何与它们的容器进行交互作用。容器负责提供公用的服务，例如目录服务、事务管理、安全性、资源缓冲池以及容错性。但这里值得注意的是，EJB并不是实现&lt;strong&gt;&lt;u&gt;J2EE&lt;/u&gt;&lt;/strong&gt;的唯一途径。正是由于&lt;strong&gt;&lt;u&gt;J2EE&lt;/u&gt;&lt;/strong&gt;的开放性，使得有的厂商能够以一种和EJB平行的方式来达到同样的目的。    &lt;br /&gt;4.RMI(Remote Method Invoke):    &lt;br /&gt;正如其名字所表示的那样，RMI协议调用远程对象上方法。它使用了序列化方式在客户端和服务器端传递数据。RMI是一种被EJB使用的更底层的协议。    &lt;br /&gt;5.Java IDL/CORBA:    &lt;br /&gt;在Java IDL的支持下，开发人员可以将Java和CORBA集成在一起。 他们可以创建Java对象并使之可在CORBA ORB中展开, 或者他们还可以创建Java类并作为和其它ORB一起展开的CORBA对象的客户。后一种方法提供了另外一种途径，通过它Java可以被用于将你的新的应用和旧的系统相集成。    &lt;br /&gt;6.JSP(Java Server Pages):    &lt;br /&gt;JSP页面由HTML代码和嵌入其中的Java代码所组成。服务器在页面被客户端所请求以后对这些Java代码进行处理，然后将生成的HTML页面返回给客户端的浏览器。    &lt;br /&gt;7.Java Servlet:    &lt;br /&gt;Servlet是一种小型的Java程序，它扩展了Web服务器的功能。作为一种服务器端的应用，当被请求时开始执行，这和CGI Perl脚本很相似。Servlet提供的功能大多与JSP类似，不过实现的方式不同。JSP通常是大多数HTML代码中嵌入少量的Java代码，而servlets全部由Java写成并且生成HTML。    &lt;br /&gt;8.XML(Extensible Markup Language):    &lt;br /&gt;XML是一种可以用来定义其它标记语言的语言。它被用来在不同的商务过程中共享数据。XML的发展和Java是相互独立的，但是，它和Java具有的相同目标正是平台独立性。通过将Java和XML的组合，您可以得到一个完美的具有平台独立性的解决方案。    &lt;br /&gt;9.JMS(Java Message Service):    &lt;br /&gt;MS是用于和面向消息的中间件相互通信的应用程序接口(API)。它既支持点对点的域，有支持发布/订阅(publish/subscribe)类型的域，并且提供对下列类型的支持：经认可的消息传递,事务型消息的传递，一致性消息和具有持久性的订阅者支持。JMS还提供了另一种方式来对您的应用与旧的后台系统相集成。    &lt;br /&gt;10.JTA(Java Transaction Architecture):    &lt;br /&gt;JTA定义了一种标准的API，应用系统由此可以访问各种事务监控。    &lt;br /&gt;11.JTS(Java Transaction Service):    &lt;br /&gt;JTS是CORBA OTS事务监控的基本的实现。JTS规定了事务管理器的实现方式。该事务管理器是在高层支持Java Transaction API (JTA)规范，并且在较底层实现OMG OTS specification的Java映像。JTS事务管理器为应用服务器、资源管理器、独立的应用以及通信资源管理器提供了事务服务。    &lt;br /&gt;12.JavaMail:    &lt;br /&gt;JavaMail是用于存取邮件服务器的API，它提供了一套邮件服务器的抽象类。不仅支持SMTP服务器，也支持IMAP服务器。    &lt;br /&gt;13.JAF(JavaBeans Activation Framework):    &lt;br /&gt;JavaMail利用JAF来处理MIME编码的邮件附件。MIME的字节流可以被转换成Java对象，或者转换自Java对象。大多数应用都可以不需要直接使用JAF。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;转自:&lt;a href="http://hi.baidu.com/dinguangx/blog/item/c6f5003ddcd688c19e3d6279.html"&gt;http://hi.baidu.com/dinguangx/blog/item/c6f5003ddcd688c19e3d6279.html&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/wuhen/aggbug/2119409.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wuhen/archive/2011/07/28/2119409.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wuhen/archive/2011/07/28/2119116.html</id><title type="text">pl/sql中添加 shortcuts插件</title><summary type="text">在pl/sql中添加快捷键的支持只需要把一个文本类型的文件plugin.txt放入到pl/sql安装目录下的plugins文件夹中。 其中plugin.txt 文件中的内容为（自定义的内容，可以根据自己的习惯设置）： s = select * from sc* = select count(*) from w = where ss = select /*+parallel(a,6)*/ * fro...</summary><published>2011-07-28T01:05:00Z</published><updated>2011-07-28T01:05:00Z</updated><author><name>JOY</name><uri>http://www.cnblogs.com/wuhen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wuhen/archive/2011/07/28/2119116.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wuhen/archive/2011/07/28/2119116.html"/><content type="html">&lt;p&gt;在pl/sql中添加快捷键的支持只需要把一个文本类型的文件plugin.txt放入到pl/sql安装目录下的plugins文件夹中。&lt;/p&gt;  &lt;p&gt;其中plugin.txt 文件中的内容为（自定义的内容，可以根据自己的习惯设置）：&lt;/p&gt;  &lt;p&gt;s = select * from    &lt;br /&gt;sc* = select count(*) from     &lt;br /&gt;w = where     &lt;br /&gt;ss = select /*+parallel(a,6)*/ * from &lt;/p&gt;  &lt;p&gt;打开pl/sql developer进入[首选项]-&amp;gt;[用户界面]-&amp;gt;[编辑器]-&amp;gt;[autoreplace]，选中enabled复选框，再查找 plugin.txt所在的路径，点击[应用]即完成插件的安装。&lt;/p&gt;  &lt;p&gt;重启pl/sql developer，打开sql编辑窗口，输入s，再按空格，就可以出现select * from，这样就可以不必每次都输入这段经常使用而又经常打错的语句了。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/wuhen/aggbug/2119116.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wuhen/archive/2011/07/28/2119116.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wuhen/articles/2054955.html</id><title type="text">关于正则表达式</title><summary type="text">关于正则表达式：正则表达式简介（微软篇）之一正则表达式
如果原来没有使用过正则表达式，那么可能对这个术语和概念会不太熟悉。不过，它们并不是您想象的那么新奇。请回想一下在硬盘上是如何查找文件的。您肯定会使用? 和* 字符来帮助查找您正寻找的文件。? 字符匹配文件名中的单个字符，而* 则匹配一个或多个字符。一个如&amp;#39;data?.dat&amp;#39; 的模式可以找到下述文件：data1.datdata2.datda...</summary><published>2011-05-24T00:53:00Z</published><updated>2011-05-24T00:53:00Z</updated><author><name>JOY</name><uri>http://www.cnblogs.com/wuhen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wuhen/articles/2054955.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wuhen/articles/2054955.html"/><content type="html">
&lt;div&gt;&lt;span style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Simsun; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" &gt;关于正则表达式：正则表达式简介（微软篇）之一正则表达式&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="_Toc145993314" id="_Toc145993314"&gt;&lt;span style="COLOR: black"&gt;如果原来没有使用过正则表达式，那么可能对这个术语和概念会不太熟悉。不过，它们并不是您想象的那么新奇。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;请回想一下在硬盘上是如何查找文件的。您肯定会使用&lt;/span&gt;&lt;span style="COLOR: black"&gt;? &lt;/span&gt;&lt;span style="COLOR: black"&gt;和&lt;/span&gt;&lt;span style="COLOR: black"&gt;* &lt;/span&gt;&lt;span style="COLOR: black"&gt;字符来帮助查找您正寻找的文件。&lt;/span&gt;&lt;span style="COLOR: black"&gt;? &lt;/span&gt;&lt;span style="COLOR: black"&gt;字符匹配文件名中的单个字符，而&lt;/span&gt;&lt;span style="COLOR: black"&gt;* &lt;/span&gt;&lt;span style="COLOR: black"&gt;则匹配一个或多个字符。一个如&lt;/span&gt;&lt;span style="COLOR: black"&gt;'data?.dat' &lt;/span&gt;&lt;span style="COLOR: black"&gt;的模式可以找到下述文件：&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;data1.dat&lt;br/&gt;&lt;br/&gt;data2.dat&lt;br/&gt;&lt;br/&gt;datax.dat&lt;br/&gt;&lt;br/&gt;dataN.dat&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;如果使用&lt;/span&gt;&lt;span style="COLOR: black"&gt;* &lt;/span&gt;&lt;span style="COLOR: black"&gt;字符代替&lt;/span&gt;&lt;span style="COLOR: black"&gt;? &lt;/span&gt;&lt;span style="COLOR: black"&gt;字符，则将扩大找到的文件数量。&lt;/span&gt;&lt;span style="COLOR: black"&gt;'data*.dat' &lt;/span&gt;&lt;span style="COLOR: black"&gt;可以匹配下述所有文件名：&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;data.dat&lt;br/&gt;&lt;br/&gt;data1.dat&lt;br/&gt;&lt;br/&gt;data2.dat&lt;br/&gt;&lt;br/&gt;data12.dat&lt;br/&gt;&lt;br/&gt;datax.dat&lt;br/&gt;&lt;br/&gt;dataXYZ.dat&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;尽管这种搜索文件的方法肯定很有用，但也十分有限。&lt;/span&gt;&lt;span style="COLOR: black"&gt;? &lt;/span&gt;&lt;span style="COLOR: black"&gt;和&lt;/span&gt;&lt;span style="COLOR: black"&gt;* &lt;/span&gt;&lt;span style="COLOR: black"&gt;通配符的有限能力可以使你对正则表达式能做什么有一个概念，不过正则表达式的功能更强大，也更灵活&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="FONT-SIZE: 24pt"&gt;正则表达式的早期起源：正则表达式简介（微软篇）之二 &lt;/span&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;正则表达式的早期起源正则表达式的&lt;/span&gt;&lt;span style="COLOR: black"&gt;"&lt;/span&gt;&lt;span style="COLOR: black"&gt;祖先&lt;/span&gt;&lt;span style="COLOR: black"&gt;"&lt;/span&gt;&lt;span style="COLOR: black"&gt;可以一直上溯至对人类神经系统如何工作的早期研究。&lt;/span&gt;&lt;span style="COLOR: black"&gt;Warren McCulloch &lt;/span&gt;&lt;span style="COLOR: black"&gt;和&lt;/span&gt;&lt;span style="COLOR: black"&gt;Walter Pitts &lt;/span&gt;&lt;span style="COLOR: black"&gt;这两位神经生理学家研究出一种数学方式来描述这些神经网络。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;1956 &lt;/span&gt;&lt;span style="COLOR: black"&gt;年&lt;/span&gt;&lt;span style="COLOR: black"&gt;, &lt;/span&gt;&lt;span style="COLOR: black"&gt;一位叫&lt;/span&gt;&lt;span style="COLOR: black"&gt;Stephen Kleene &lt;/span&gt;&lt;span style="COLOR: black"&gt;的美国数学家在&lt;/span&gt;&lt;span style="COLOR: black"&gt;McCulloch &lt;/span&gt;&lt;span style="COLOR: black"&gt;和&lt;/span&gt;&lt;span style="COLOR: black"&gt;Pitts &lt;/span&gt;&lt;span style="COLOR: black"&gt;早期工作的基础上，发表了一篇标题为&lt;/span&gt;&lt;span style="COLOR: black"&gt;"&lt;/span&gt;&lt;span style="COLOR: black"&gt;神经网事件的表示法&lt;/span&gt;&lt;span style="COLOR: black"&gt;"&lt;/span&gt;&lt;span style="COLOR: black"&gt;的论文，引入了正则表达式的概念。正则表达式就是用来描述他称为&lt;/span&gt;&lt;span style="COLOR: black"&gt;"&lt;/span&gt;&lt;span style="COLOR: black"&gt;正则集的代数&lt;/span&gt;&lt;span style="COLOR: black"&gt;"&lt;/span&gt;&lt;span style="COLOR: black"&gt;的表达式，因此采用&lt;/span&gt;&lt;span style="COLOR: black"&gt;"&lt;/span&gt;&lt;span style="COLOR: black"&gt;正则表达式&lt;/span&gt;&lt;span style="COLOR: black"&gt;"&lt;/span&gt;&lt;span style="COLOR: black"&gt;这个术语。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;随后，发现可以将这一工作应用于使用&lt;/span&gt;&lt;span style="COLOR: black"&gt;Ken Thompson &lt;/span&gt;&lt;span style="COLOR: black"&gt;的计算搜索算法的一些早期研究，&lt;/span&gt;&lt;span style="COLOR: black"&gt;Ken Thompson&lt;/span&gt;&lt;span style="COLOR: black"&gt;是&lt;/span&gt;&lt;span style="COLOR: black"&gt;Unix &lt;/span&gt;&lt;span style="COLOR: black"&gt;的主要发明人。正则表达式的第一个实用应用程序就是&lt;/span&gt;&lt;span style="COLOR: black"&gt;Unix &lt;/span&gt;&lt;span style="COLOR: black"&gt;中的&lt;/span&gt;&lt;span style="COLOR: black"&gt;qed &lt;/span&gt;&lt;span style="COLOR: black"&gt;编辑器。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;如他们所说，剩下的就是众所周知的历史了。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="FONT-SIZE: 24pt"&gt;使用正则表达式：正则表达式简介（微软篇）之三使用正则表达式&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="COLOR: black"&gt;在典型的搜索和替换操作中，必须提供要查找的确切文字。这种技术对于静态文本中的简单搜索和替换任务可能足够了，但是由于它缺乏灵活性，因此在搜索动态文本时就有困难了，甚至是不可能的。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;使用正则表达式，就可以：&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;1.&lt;/span&gt;&lt;span style="COLOR: black"&gt;测试字符串的某个模式。例如，可以对一个输入字符串进行测试，看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;2.&lt;/span&gt;&lt;span style="COLOR: black"&gt;替换文本。可以在文档中使用一个正则表达式来标识特定文字，然后可以全部将其删除，或者替换为别的文字。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;3.&lt;/span&gt;&lt;span style="COLOR: black"&gt;根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;例如，如果需要搜索整个&lt;/span&gt;&lt;span style="COLOR: black"&gt;web &lt;/span&gt;&lt;span style="COLOR: black"&gt;站点来删除某些过时的材料并替换某些&lt;/span&gt;&lt;span style="COLOR: black"&gt;HTML &lt;/span&gt;&lt;span style="COLOR: black"&gt;格式化标记，则可以使用正则表达式对每个文件进行测试，看在该文件中是否存在所要查找的材料或&lt;/span&gt;&lt;span style="COLOR: black"&gt;HTML &lt;/span&gt;&lt;span style="COLOR: black"&gt;格式化标记。用这个方法，就可以将受影响的文件范围缩小到包含要删除或更改的材料的那些文件。然后可以使用正则表达式来删除过时的材料，最后，可以再次使用正则表达式来查找并替换那些需要替换的标记。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;另一个说明正则表达式非常有用的示例是一种其字符串处理能力还不为人所知的语言。&lt;/span&gt;&lt;span style="COLOR: black"&gt;VBScript &lt;/span&gt;&lt;span style="COLOR: black"&gt;是&lt;/span&gt;&lt;span style="COLOR: black"&gt;Visual Basic &lt;/span&gt;&lt;span style="COLOR: black"&gt;的一个子集，具有丰富的字符串处理功能。与&lt;/span&gt;&lt;span style="COLOR: black"&gt;C &lt;/span&gt;&lt;span style="COLOR: black"&gt;类似的&lt;/span&gt;&lt;span style="COLOR: black"&gt;Visual Basic Scripting Edition &lt;/span&gt;&lt;span style="COLOR: black"&gt;则没有这一能力。正则表达式给&lt;/span&gt;&lt;span style="COLOR: black"&gt;Visual Basic Scripting Edition &lt;/span&gt;&lt;span style="COLOR: black"&gt;的字符串处理能力带来了明显改善。不过，可能还是在&lt;/span&gt;&lt;span style="COLOR: black"&gt;VBScript &lt;/span&gt;&lt;span style="COLOR: black"&gt;中使用正则表达式的效率更高，它允许在单个表达式中执行多个字符串操作。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 24pt"&gt;正则表达式语法：正则表达式简介（微软篇）之四正则表达式语法 &lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;一个正则表达式就是由普通字符（例如字符&lt;/span&gt;&lt;span style="COLOR: black"&gt;a &lt;/span&gt;&lt;span style="COLOR: black"&gt;到&lt;/span&gt;&lt;span style="COLOR: black"&gt;z&lt;/span&gt;&lt;span style="COLOR: black"&gt;）以及特殊字符（称为元字符）组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板，将某个字符模式与所搜索的字符串进行匹配。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;这里有一些可能会遇到的正则表达式示例：&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;Visual Basic VBScript &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;Scripting Edition&lt;br/&gt;&lt;br/&gt;/^\[ \t]*$/ "^\[ \t]*$" &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配一个空白行。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;/\d{2}-\d{5}/ "\d{2}-\d{5}" &lt;/span&gt;&lt;span style="COLOR: black"&gt;验证一个&lt;/span&gt;&lt;span style="COLOR: black"&gt;ID&lt;/span&gt;&lt;span style="COLOR: black"&gt;号码是否由一个&lt;/span&gt;&lt;span style="COLOR: black"&gt;2&lt;/span&gt;&lt;span style="COLOR: black"&gt;位字，一个连字符以及一个&lt;/span&gt;&lt;span style="COLOR: black"&gt;5&lt;/span&gt;&lt;span style="COLOR: black"&gt;位数字组成。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;/&amp;lt;(.*)&amp;gt;.*&amp;lt;\/\1&amp;gt;/ "&amp;lt;(.*)&amp;gt;.*&amp;lt;\/\1&amp;gt;" &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配一个&lt;/span&gt;&lt;span style="COLOR: black"&gt;HTML &lt;/span&gt;&lt;span style="COLOR: black"&gt;标记。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;下表是元字符及其在正则表达式上下文中的行为的一个完整列表：&lt;/span&gt;&lt;/div&gt;
&lt;br/&gt;&lt;div&gt;&lt;span style="COLOR: black"&gt;字符&lt;/span&gt;&lt;span style="COLOR: black"&gt;描述&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;\ &lt;/span&gt;&lt;span style="COLOR: black"&gt;将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。例如，&lt;/span&gt;&lt;span style="COLOR: black"&gt;'n' &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配字符&lt;/span&gt;&lt;span style="COLOR: black"&gt;"n"&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;'\n' &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配一个换行符。序列&lt;/span&gt;&lt;span style="COLOR: black"&gt;'\\' &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"\" &lt;/span&gt;&lt;span style="COLOR: black"&gt;而&lt;/span&gt;&lt;span style="COLOR: black"&gt;"\(" &lt;/span&gt;&lt;span style="COLOR: black"&gt;则匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"("&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;^ &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配输入字符串的开始位置。如果设置了&lt;/span&gt;&lt;span style="COLOR: black"&gt;RegExp &lt;/span&gt;&lt;span style="COLOR: black"&gt;对象的&lt;/span&gt;&lt;span style="COLOR: black"&gt;Multiline &lt;/span&gt;&lt;span style="COLOR: black"&gt;属性，&lt;/span&gt;&lt;span style="COLOR: black"&gt;^ &lt;/span&gt;&lt;span style="COLOR: black"&gt;也匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;'\n' &lt;/span&gt;&lt;span style="COLOR: black"&gt;或&lt;/span&gt;&lt;span style="COLOR: black"&gt;'\r' &lt;/span&gt;&lt;span style="COLOR: black"&gt;之后的位置。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;$ &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配输入字符串的结束位置。如果设置了&lt;/span&gt;&lt;span style="COLOR: black"&gt;RegExp &lt;/span&gt;&lt;span style="COLOR: black"&gt;对象的&lt;/span&gt;&lt;span style="COLOR: black"&gt;Multiline &lt;/span&gt;&lt;span style="COLOR: black"&gt;属性，&lt;/span&gt;&lt;span style="COLOR: black"&gt;$ &lt;/span&gt;&lt;span style="COLOR: black"&gt;也匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;'\n' &lt;/span&gt;&lt;span style="COLOR: black"&gt;或&lt;/span&gt;&lt;span style="COLOR: black"&gt;'\r' &lt;/span&gt;&lt;span style="COLOR: black"&gt;之前的位置。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;* &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配前面的子表达式零次或多次。例如，&lt;/span&gt;&lt;span style="COLOR: black"&gt;zo* &lt;/span&gt;&lt;span style="COLOR: black"&gt;能匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"z" &lt;/span&gt;&lt;span style="COLOR: black"&gt;以及&lt;/span&gt;&lt;span style="COLOR: black"&gt;"zoo"&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;* &lt;/span&gt;&lt;span style="COLOR: black"&gt;等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;{0,}&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;+ &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配前面的子表达式一次或多次。例如，&lt;/span&gt;&lt;span style="COLOR: black"&gt;'zo+' &lt;/span&gt;&lt;span style="COLOR: black"&gt;能匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"zo" &lt;/span&gt;&lt;span style="COLOR: black"&gt;以及&lt;/span&gt;&lt;span style="COLOR: black"&gt;"zoo"&lt;/span&gt;&lt;span style="COLOR: black"&gt;，但不能匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"z"&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;+ &lt;/span&gt;&lt;span style="COLOR: black"&gt;等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;{1,}&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;? &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配前面的子表达式零次或一次。例如，&lt;/span&gt;&lt;span style="COLOR: black"&gt;"do(es)?" &lt;/span&gt;&lt;span style="COLOR: black"&gt;可以匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"do" &lt;/span&gt;&lt;span style="COLOR: black"&gt;或&lt;/span&gt;&lt;span style="COLOR: black"&gt;"does" &lt;/span&gt;&lt;span style="COLOR: black"&gt;中的&lt;/span&gt;&lt;span style="COLOR: black"&gt;"do" &lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;? &lt;/span&gt;&lt;span style="COLOR: black"&gt;等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;{0,1}&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;{n} n &lt;/span&gt;&lt;span style="COLOR: black"&gt;是一个非负整数。匹配确定的&lt;/span&gt;&lt;span style="COLOR: black"&gt;n &lt;/span&gt;&lt;span style="COLOR: black"&gt;次。例如，&lt;/span&gt;&lt;span style="COLOR: black"&gt;'o{2}' &lt;/span&gt;&lt;span style="COLOR: black"&gt;不能匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"Bob" &lt;/span&gt;&lt;span style="COLOR: black"&gt;中的&lt;/span&gt;&lt;span style="COLOR: black"&gt;'o'&lt;/span&gt;&lt;span style="COLOR: black"&gt;，但是能匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"food" &lt;/span&gt;&lt;span style="COLOR: black"&gt;中的两个&lt;/span&gt;&lt;span style="COLOR: black"&gt;o&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;{n,} n &lt;/span&gt;&lt;span style="COLOR: black"&gt;是一个非负整数。至少匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;n &lt;/span&gt;&lt;span style="COLOR: black"&gt;次。例如，&lt;/span&gt;&lt;span style="COLOR: black"&gt;'o{2,}' &lt;/span&gt;&lt;span style="COLOR: black"&gt;不能匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"Bob" &lt;/span&gt;&lt;span style="COLOR: black"&gt;中的&lt;/span&gt;&lt;span style="COLOR: black"&gt;'o'&lt;/span&gt;&lt;span style="COLOR: black"&gt;，但能匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"foooood" &lt;/span&gt;&lt;span style="COLOR: black"&gt;中的所有&lt;/span&gt;&lt;span style="COLOR: black"&gt;o&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;'o{1,}'&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;'o+'&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;'o{0,}' &lt;/span&gt;&lt;span style="COLOR: black"&gt;则等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;'o*'&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;{n,m} m &lt;/span&gt;&lt;span style="COLOR: black"&gt;和&lt;/span&gt;&lt;span style="COLOR: black"&gt;n &lt;/span&gt;&lt;span style="COLOR: black"&gt;均为非负整数，其中&lt;/span&gt;&lt;span style="COLOR: black"&gt;n &amp;lt;= m&lt;/span&gt;&lt;span style="COLOR: black"&gt;。最少匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;n &lt;/span&gt;&lt;span style="COLOR: black"&gt;次且最多匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;m &lt;/span&gt;&lt;span style="COLOR: black"&gt;次。刘，&lt;/span&gt;&lt;span style="COLOR: black"&gt;"o{1,3}" &lt;/span&gt;&lt;span style="COLOR: black"&gt;将匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"fooooood" &lt;/span&gt;&lt;span style="COLOR: black"&gt;中的前三个&lt;/span&gt;&lt;span style="COLOR: black"&gt;o&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;'o{0,1}'&lt;/span&gt;&lt;span style="COLOR: black"&gt;等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;'o?'&lt;/span&gt;&lt;span style="COLOR: black"&gt;。请注意在逗号和两个数之间不能有空格&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: red"&gt;? &lt;/span&gt;&lt;span style="COLOR: red"&gt;当该字符紧跟在任何一个其他限制符&lt;/span&gt;&lt;span style="COLOR: red"&gt;(*, +, ?, {n}, {n,},{n,m}) &lt;/span&gt;&lt;span style="COLOR: red"&gt;后面时，匹配模式是非贪婪的。非贪婪模式尽可能少的&lt;/span&gt;&lt;span style="COLOR: red"&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: red"&gt;匹配所搜索的字符串，而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如，对于字符串&lt;/span&gt;&lt;span style="COLOR: red"&gt;"oooo"&lt;/span&gt;&lt;span style="COLOR: red"&gt;，&lt;/span&gt;&lt;span style="COLOR: red"&gt;'o+?' &lt;/span&gt;&lt;span style="COLOR: red"&gt;将匹配单个&lt;/span&gt;&lt;span style="COLOR: red"&gt;"o"&lt;/span&gt;&lt;span style="COLOR: red"&gt;，而&lt;/span&gt;&lt;span style="COLOR: red"&gt;'o+' &lt;/span&gt;&lt;span style="COLOR: red"&gt;将匹配所有&lt;/span&gt;&lt;span style="COLOR: red"&gt;'o'&lt;/span&gt;&lt;span style="COLOR: red"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;. &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配除&lt;/span&gt;&lt;span style="COLOR: black"&gt;"\n" &lt;/span&gt;&lt;span style="COLOR: black"&gt;之外的任何单个字符。要匹配包括&lt;/span&gt;&lt;span style="COLOR: black"&gt;'\n' &lt;/span&gt;&lt;span style="COLOR: black"&gt;在内的任何字符，请使用象&lt;/span&gt;&lt;span style="COLOR: black"&gt;'[.\n]' &lt;/span&gt;&lt;span style="COLOR: black"&gt;的模式。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;(pattern) &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;pattern &lt;/span&gt;&lt;span style="COLOR: black"&gt;并获取这一匹配。所获取的匹配可以从产生的&lt;/span&gt;&lt;span style="COLOR: black"&gt;Matches &lt;/span&gt;&lt;span style="COLOR: black"&gt;集合得到，在&lt;/span&gt;&lt;span style="COLOR: black"&gt;VBScript &lt;/span&gt;&lt;span style="COLOR: black"&gt;中使用&lt;/span&gt;&lt;span style="COLOR: black"&gt;SubMatches &lt;/span&gt;&lt;span style="COLOR: black"&gt;集合，在&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;Visual Basic Scripting Edition &lt;/span&gt;&lt;span style="COLOR: black"&gt;中则使用&lt;/span&gt;&lt;span style="COLOR: black"&gt;$0…$9 &lt;/span&gt;&lt;span style="COLOR: black"&gt;属性。要匹配圆括号字符，请使用&lt;/span&gt;&lt;span style="COLOR: black"&gt;'\(' &lt;/span&gt;&lt;span style="COLOR: black"&gt;或&lt;/span&gt;&lt;span style="COLOR: black"&gt;'\)'&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;(?:pattern) &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;pattern &lt;/span&gt;&lt;span style="COLOR: black"&gt;但不获取匹配结果，也就是说这是一个非获取匹配，不进行存储供以后使用。这在使用&lt;/span&gt;&lt;span style="COLOR: black"&gt;"&lt;/span&gt;&lt;span style="COLOR: black"&gt;或&lt;/span&gt;&lt;span style="COLOR: black"&gt;" &lt;/span&gt;&lt;span style="COLOR: black"&gt;字符&lt;/span&gt;&lt;span style="COLOR: black"&gt;(&lt;/span&gt;&lt;span style="COLOR: black"&gt;　&lt;/span&gt;&lt;span style="COLOR: black"&gt;) &lt;/span&gt;&lt;span style="COLOR: black"&gt;来组合&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;一个模式的各个部分是很有用。例如，&lt;/span&gt;&lt;span style="COLOR: black"&gt;'industr(?:y&lt;/span&gt;&lt;span style="COLOR: black"&gt;　&lt;/span&gt;&lt;span style="COLOR: black"&gt;ies) &lt;/span&gt;&lt;span style="COLOR: black"&gt;就是一个比&lt;/span&gt;&lt;span style="COLOR: black"&gt;'industry&lt;/span&gt;&lt;span style="COLOR: black"&gt;　&lt;/span&gt;&lt;span style="COLOR: black"&gt;industries' &lt;/span&gt;&lt;span style="COLOR: black"&gt;更简略的表达式。&lt;/span&gt;&lt;/div&gt;
&lt;br/&gt;&lt;div&gt;&lt;span style="COLOR: black"&gt;(?=pattern) &lt;/span&gt;&lt;span style="COLOR: black"&gt;正向预查，在任何匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;pattern &lt;/span&gt;&lt;span style="COLOR: black"&gt;的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;使用。例如，&lt;/span&gt;&lt;span style="COLOR: black"&gt;'Windows (?=95&lt;/span&gt;&lt;span style="COLOR: black"&gt;　&lt;/span&gt;&lt;span style="COLOR: black"&gt;98&lt;/span&gt;&lt;span style="COLOR: black"&gt;　&lt;/span&gt;&lt;span style="COLOR: black"&gt;NT&lt;/span&gt;&lt;span style="COLOR: black"&gt;　&lt;/span&gt;&lt;span style="COLOR: black"&gt;2000)' &lt;/span&gt;&lt;span style="COLOR: black"&gt;能匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"Windows 2000"&lt;/span&gt;&lt;span style="COLOR: black"&gt;中的&lt;/span&gt;&lt;span style="COLOR: black"&gt;"Windows"&lt;/span&gt;&lt;span style="COLOR: black"&gt;，但不能匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"Windows3 .1"&lt;/span&gt;&lt;span style="COLOR: black"&gt;中&lt;/span&gt;&lt;span style="COLOR: black"&gt;"Windows"&lt;/span&gt;&lt;span style="COLOR: black"&gt;。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;(?!pattern) &lt;/span&gt;&lt;span style="COLOR: black"&gt;负向预查，在任何不匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;Negative lookahead matches the search string at any point where a string not matching pattern &lt;/span&gt;&lt;span style="COLOR: black"&gt;的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如&lt;/span&gt;&lt;span style="COLOR: black"&gt;'Windows(?!95&lt;/span&gt;&lt;span style="COLOR: black"&gt;　&lt;/span&gt;&lt;span style="COLOR: black"&gt;98&lt;/span&gt;&lt;span style="COLOR: black"&gt;　&lt;/span&gt;&lt;span style="COLOR: black"&gt;NT&lt;/span&gt;&lt;span style="COLOR: black"&gt;　&lt;/span&gt;&lt;span style="COLOR: black"&gt;2000)' &lt;/span&gt;&lt;span style="COLOR: black"&gt;能匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"Windows 3.1" &lt;/span&gt;&lt;span style="COLOR: black"&gt;中的&lt;/span&gt;&lt;span style="COLOR: black"&gt;"Windows"&lt;/span&gt;&lt;span style="COLOR: black"&gt;，但不能匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"Windows 2000" &lt;/span&gt;&lt;span style="COLOR: black"&gt;中的&lt;/span&gt;&lt;span style="COLOR: black"&gt;"Windows"&lt;/span&gt;&lt;span style="COLOR: black"&gt;。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始&lt;/span&gt;&lt;span style="COLOR: black"&gt;x&lt;/span&gt;&lt;span style="COLOR: black"&gt;　&lt;/span&gt;&lt;span style="COLOR: black"&gt;y &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;x &lt;/span&gt;&lt;span style="COLOR: black"&gt;或&lt;/span&gt;&lt;span style="COLOR: black"&gt;y&lt;/span&gt;&lt;span style="COLOR: black"&gt;。例如，&lt;/span&gt;&lt;span style="COLOR: black"&gt;'z&lt;/span&gt;&lt;span style="COLOR: black"&gt;　&lt;/span&gt;&lt;span style="COLOR: black"&gt;food' &lt;/span&gt;&lt;span style="COLOR: black"&gt;能匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"z" &lt;/span&gt;&lt;span style="COLOR: black"&gt;或&lt;/span&gt;&lt;span style="COLOR: black"&gt;"food"&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;'(z&lt;/span&gt;&lt;span style="COLOR: black"&gt;　&lt;/span&gt;&lt;span style="COLOR: black"&gt;f)&lt;br/&gt;ood' &lt;/span&gt;&lt;span style="COLOR: black"&gt;则匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"zood" &lt;/span&gt;&lt;span style="COLOR: black"&gt;或&lt;/span&gt;&lt;span style="COLOR: black"&gt;"food"&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;[xyz] &lt;/span&gt;&lt;span style="COLOR: black"&gt;字符集合。匹配所包含的任意一个字符。例如，&lt;/span&gt;&lt;span style="COLOR: black"&gt;'[abc]' &lt;/span&gt;&lt;span style="COLOR: black"&gt;可以匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"plain" &lt;/span&gt;&lt;span style="COLOR: black"&gt;中的&lt;/span&gt;&lt;span style="COLOR: black"&gt;'a'&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;[^xyz] &lt;/span&gt;&lt;span style="COLOR: black"&gt;负值字符集合。匹配未包含的任意字符。例如，&lt;/span&gt;&lt;span style="COLOR: black"&gt;'[^abc]' &lt;/span&gt;&lt;span style="COLOR: black"&gt;可以匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"plain" &lt;/span&gt;&lt;span style="COLOR: black"&gt;中的&lt;/span&gt;&lt;span style="COLOR: black"&gt;'p'&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;[a-z] &lt;/span&gt;&lt;span style="COLOR: black"&gt;字符范围。匹配指定范围内的任意字符。例如，&lt;/span&gt;&lt;span style="COLOR: black"&gt;'[a-z]' &lt;/span&gt;&lt;span style="COLOR: black"&gt;可以匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;'a' &lt;/span&gt;&lt;span style="COLOR: black"&gt;到&lt;/span&gt;&lt;span style="COLOR: black"&gt;'z' &lt;/span&gt;&lt;span style="COLOR: black"&gt;范围内的任意小写字母字符。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;[^a-z] &lt;/span&gt;&lt;span style="COLOR: black"&gt;负值字符范围。匹配任何不在指定范围内的任意字符。例如，&lt;/span&gt;&lt;span style="COLOR: black"&gt;'[^a-z]' &lt;/span&gt;&lt;span style="COLOR: black"&gt;可以匹配任何不在&lt;/span&gt;&lt;span style="COLOR: black"&gt;'a' &lt;/span&gt;&lt;span style="COLOR: black"&gt;到&lt;/span&gt;&lt;span style="COLOR: black"&gt;'z' &lt;/span&gt;&lt;span style="COLOR: black"&gt;范围内的任意字符。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;\b &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配一个单词边界，也就是指单词和空格间的位置。例如，&lt;/span&gt;&lt;span style="COLOR: black"&gt;'er\b' &lt;/span&gt;&lt;span style="COLOR: black"&gt;可以匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"never" &lt;/span&gt;&lt;span style="COLOR: black"&gt;中的&lt;/span&gt;&lt;span style="COLOR: black"&gt;'er'&lt;/span&gt;&lt;span style="COLOR: black"&gt;，但不能匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"verb" &lt;/span&gt;&lt;span style="COLOR: black"&gt;中的&lt;/span&gt;&lt;span style="COLOR: black"&gt;'er'&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;\B &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配非单词边界。&lt;/span&gt;&lt;span style="COLOR: black"&gt;'er\B' &lt;/span&gt;&lt;span style="COLOR: black"&gt;能匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"verb" &lt;/span&gt;&lt;span style="COLOR: black"&gt;中的&lt;/span&gt;&lt;span style="COLOR: black"&gt;'er'&lt;/span&gt;&lt;span style="COLOR: black"&gt;，但不能匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"never" &lt;/span&gt;&lt;span style="COLOR: black"&gt;中的&lt;/span&gt;&lt;span style="COLOR: black"&gt;'er'&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;\cx &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配由&lt;/span&gt;&lt;span style="COLOR: black"&gt;x&lt;/span&gt;&lt;span style="COLOR: black"&gt;指明的控制字符。例如，&lt;/span&gt;&lt;span style="COLOR: black"&gt;\cM &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配一个&lt;/span&gt;&lt;span style="COLOR: black"&gt;Control-M &lt;/span&gt;&lt;span style="COLOR: black"&gt;或回车符。&lt;/span&gt;&lt;span style="COLOR: black"&gt;x &lt;/span&gt;&lt;span style="COLOR: black"&gt;的值必须为&lt;/span&gt;&lt;span style="COLOR: black"&gt;A-Z &lt;/span&gt;&lt;span style="COLOR: black"&gt;或&lt;/span&gt;&lt;span style="COLOR: black"&gt;a-z &lt;/span&gt;&lt;span style="COLOR: black"&gt;之一。否则，将&lt;/span&gt;&lt;span style="COLOR: black"&gt;c &lt;/span&gt;&lt;span style="COLOR: black"&gt;视为一个原义的&lt;/span&gt;&lt;span style="COLOR: black"&gt;'c' &lt;/span&gt;&lt;span style="COLOR: black"&gt;字符。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;\d &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配一个数字字符。等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;[0-9]&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;\D &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配一个非数字字符。等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;[^0-9]&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;\f &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配一个换页符。等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;\x0c &lt;/span&gt;&lt;span style="COLOR: black"&gt;和&lt;/span&gt;&lt;span style="COLOR: black"&gt;\cL&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;\n &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配一个换行符。等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;\x0a &lt;/span&gt;&lt;span style="COLOR: black"&gt;和&lt;/span&gt;&lt;span style="COLOR: black"&gt;\cJ&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;\r &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配一个回车符。等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;\x0d &lt;/span&gt;&lt;span style="COLOR: black"&gt;和&lt;/span&gt;&lt;span style="COLOR: black"&gt;\cM&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;\s &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配任何空白字符，包括空格、制表符、换页符等等。等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;[ \f\n\r\t\v]&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;\S &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配任何非空白字符。等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;[^ \f\n\r\t\v]&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;\t &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配一个制表符。等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;\x09 &lt;/span&gt;&lt;span style="COLOR: black"&gt;和&lt;/span&gt;&lt;span style="COLOR: black"&gt;\cI&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;\v &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配一个垂直制表符。等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;\x0b &lt;/span&gt;&lt;span style="COLOR: black"&gt;和&lt;/span&gt;&lt;span style="COLOR: black"&gt;\cK&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;\w &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配包括下划线的任何单词字符。等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;'[A-Za-z0-9_]'&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;\W &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配任何非单词字符。等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;'[^A-Za-z0-9_]'&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;\xn &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;n&lt;/span&gt;&lt;span style="COLOR: black"&gt;，其中&lt;/span&gt;&lt;span style="COLOR: black"&gt;n &lt;/span&gt;&lt;span style="COLOR: black"&gt;为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如，&lt;/span&gt;&lt;span style="COLOR: black"&gt;'\x41' &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"A"&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;'\x041' &lt;/span&gt;&lt;span style="COLOR: black"&gt;则等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;'\x04' &amp;amp; "1"&lt;/span&gt;&lt;span style="COLOR: black"&gt;。正则表达式中可以使用&lt;/span&gt;&lt;span style="COLOR: black"&gt;ASCII &lt;/span&gt;&lt;span style="COLOR: black"&gt;编码。&lt;/span&gt;&lt;span style="COLOR: black"&gt;.&lt;br/&gt;&lt;br/&gt;\num &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;num&lt;/span&gt;&lt;span style="COLOR: black"&gt;，其中&lt;/span&gt;&lt;span style="COLOR: black"&gt;num&lt;/span&gt;&lt;span style="COLOR: black"&gt;是一个正整数。对所获取的匹配的引用。例如，&lt;/span&gt;&lt;span style="COLOR: black"&gt;'(.)\1' &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配两个连续的相同字符。&lt;/span&gt;&lt;/div&gt;
&lt;br/&gt;&lt;div&gt;&lt;span style="COLOR: black"&gt;\n &lt;/span&gt;&lt;span style="COLOR: black"&gt;标识一个八进制转义值或一个后向引用。如果&lt;/span&gt;&lt;span style="COLOR: black"&gt;\n &lt;/span&gt;&lt;span style="COLOR: black"&gt;之前至少&lt;/span&gt;&lt;span style="COLOR: black"&gt;n &lt;/span&gt;&lt;span style="COLOR: black"&gt;个获取的子表达式，则&lt;/span&gt;&lt;span style="COLOR: black"&gt;n &lt;/span&gt;&lt;span style="COLOR: black"&gt;为后向引用。否则，如果&lt;/span&gt;&lt;span style="COLOR: black"&gt;n &lt;/span&gt;&lt;span style="COLOR: black"&gt;为八进制数字&lt;/span&gt;&lt;span style="COLOR: black"&gt;(0-7)&lt;/span&gt;&lt;span style="COLOR: black"&gt;，则&lt;/span&gt;&lt;span style="COLOR: black"&gt;n &lt;/span&gt;&lt;span style="COLOR: black"&gt;为一个八进制转义值。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;\nm &lt;/span&gt;&lt;span style="COLOR: black"&gt;标识一个八进制转义值或一个后向引用。如果&lt;/span&gt;&lt;span style="COLOR: black"&gt;\nm &lt;/span&gt;&lt;span style="COLOR: black"&gt;之前至少有&lt;/span&gt;&lt;span style="COLOR: black"&gt;is preceded by at least nm &lt;/span&gt;&lt;span style="COLOR: black"&gt;个获取得子表达式，则&lt;/span&gt;&lt;span style="COLOR: black"&gt;nm &lt;/span&gt;&lt;span style="COLOR: black"&gt;为后向引用。如果&lt;/span&gt;&lt;span style="COLOR: black"&gt;\nm &lt;/span&gt;&lt;span style="COLOR: black"&gt;之前至少有&lt;/span&gt;&lt;span style="COLOR: black"&gt;n &lt;/span&gt;&lt;span style="COLOR: black"&gt;个获取，则&lt;/span&gt;&lt;span style="COLOR: black"&gt;n &lt;/span&gt;&lt;span style="COLOR: black"&gt;为一个后跟文字&lt;/span&gt;&lt;span style="COLOR: black"&gt;m &lt;/span&gt;&lt;span style="COLOR: black"&gt;的后向引用。如果前面的条件都不满足，若&lt;/span&gt;&lt;span style="COLOR: black"&gt;n &lt;/span&gt;&lt;span style="COLOR: black"&gt;和&lt;/span&gt;&lt;span style="COLOR: black"&gt;m &lt;/span&gt;&lt;span style="COLOR: black"&gt;均为八进制数字&lt;/span&gt;&lt;span style="COLOR: black"&gt;(0-7)&lt;/span&gt;&lt;span style="COLOR: black"&gt;，则&lt;/span&gt;&lt;span style="COLOR: black"&gt;\nm &lt;/span&gt;&lt;span style="COLOR: black"&gt;将匹配八进制转义值&lt;/span&gt;&lt;span style="COLOR: black"&gt;nm&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;\nml &lt;/span&gt;&lt;span style="COLOR: black"&gt;如果&lt;/span&gt;&lt;span style="COLOR: black"&gt;n &lt;/span&gt;&lt;span style="COLOR: black"&gt;为八进制数字&lt;/span&gt;&lt;span style="COLOR: black"&gt;(0-3)&lt;/span&gt;&lt;span style="COLOR: black"&gt;，且&lt;/span&gt;&lt;span style="COLOR: black"&gt;m &lt;/span&gt;&lt;span style="COLOR: black"&gt;和&lt;/span&gt;&lt;span style="COLOR: black"&gt;l &lt;/span&gt;&lt;span style="COLOR: black"&gt;均为八进制数字&lt;/span&gt;&lt;span style="COLOR: black"&gt;(0-7)&lt;/span&gt;&lt;span style="COLOR: black"&gt;，则匹配八进制转义值&lt;/span&gt;&lt;span style="COLOR: black"&gt;nml&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;\un &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;n&lt;/span&gt;&lt;span style="COLOR: black"&gt;，其中&lt;/span&gt;&lt;span style="COLOR: black"&gt;n &lt;/span&gt;&lt;span style="COLOR: black"&gt;是一个用四个十六进制数字表示的&lt;/span&gt;&lt;span style="COLOR: black"&gt;Unicode&lt;/span&gt;&lt;span style="COLOR: black"&gt;字符。例如，&lt;/span&gt;&lt;span style="COLOR: black"&gt;\u00A9 &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配版权符号&lt;/span&gt;&lt;span style="COLOR: black"&gt;(?)&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 24pt"&gt;建立正则表达式：正则表达式简介（微软篇）之五建立正则表达式 &lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;可以通过在一对分隔符之间放入表达式模式的各种组件来构造一个正则表达式。对&lt;/span&gt;&lt;span style="COLOR: black"&gt;Visual Basic Scripting Edition &lt;/span&gt;&lt;span style="COLOR: black"&gt;而言，分隔符为一对正斜杠&lt;/span&gt;&lt;span style="COLOR: black"&gt;(/) &lt;/span&gt;&lt;span style="COLOR: black"&gt;字符。例如：&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;/expression/&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;对&lt;/span&gt;&lt;span style="COLOR: black"&gt;VBScript &lt;/span&gt;&lt;span style="COLOR: black"&gt;而言，则采用一对引号&lt;/span&gt;&lt;span style="COLOR: black"&gt;("") &lt;/span&gt;&lt;span style="COLOR: black"&gt;来确定正则表达式的边界。例如：&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;"expression"&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;在上面所示的两个示例中，正则表达式模式&lt;/span&gt;&lt;span style="COLOR: black"&gt;(expression) &lt;/span&gt;&lt;span style="COLOR: black"&gt;均存储在&lt;/span&gt;&lt;span style="COLOR: black"&gt;RegExp &lt;/span&gt;&lt;span style="COLOR: black"&gt;对象的&lt;/span&gt;&lt;span style="COLOR: black"&gt;Pattern &lt;/span&gt;&lt;span style="COLOR: black"&gt;属性中。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 24pt"&gt;优先权顺序：正则表达式简介（微软篇）之六优先权顺序 &lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;在构造正则表达式之后，就可以象数学表达式一样来求值，也就是说，可以从左至右并按照一个优先权顺序来求值。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;下表从最高优先级到最低优先级列出各种正则表达式操作符的优先权顺序：&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;操作符&lt;/span&gt;&lt;span style="COLOR: black"&gt;描述&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;\ &lt;/span&gt;&lt;span style="COLOR: black"&gt;转义符&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;(), (?:), (?=), [] &lt;/span&gt;&lt;span style="COLOR: black"&gt;圆括号和方括号&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;*, +, ?, {n}, {n,}, {n,m} &lt;/span&gt;&lt;span style="COLOR: black"&gt;限定符&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;^, $, \anymetacharacter &lt;/span&gt;&lt;span style="COLOR: black"&gt;位置和顺序&lt;/span&gt;&lt;/div&gt;
&lt;br/&gt;&lt;div&gt;&lt;a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="_Toc145993315" id="_Toc145993315"&gt;&lt;span&gt;&lt;span&gt;&lt;span style="FONT-SIZE: 24pt"&gt;普通字符：正则表达式简介（微软篇）之七普通字符&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;普通字符由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符，所有数字，所有标点符号以及一些符号。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;最简单的正则表达式是一个单独的普通字符，可以匹配所搜索字符串中的该字符本身。例如，单字符模式&lt;/span&gt;&lt;span style="COLOR: black"&gt;'A' &lt;/span&gt;&lt;span style="COLOR: black"&gt;可以匹配所搜索字符串中任何位置出现的字母&lt;/span&gt;&lt;span style="COLOR: black"&gt;'A'&lt;/span&gt;&lt;span style="COLOR: black"&gt;。这里有一些单字符正则表达式模式的示例：&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;/a/&lt;br/&gt;/7/&lt;br/&gt;/M/&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;等价的&lt;/span&gt;&lt;span style="COLOR: black"&gt;VBScript &lt;/span&gt;&lt;span style="COLOR: black"&gt;单字符正则表达式为：&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;"a"&lt;br/&gt;"7"&lt;br/&gt;"M"&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;可以将多个单字符组合在一起得到一个较大的表达式。例如，下面的&lt;/span&gt;&lt;span style="COLOR: black"&gt;Visual Basic Scripting Edition &lt;/span&gt;&lt;span style="COLOR: black"&gt;正则表达式不是别的，就是通过组合单字符表达式&lt;/span&gt;&lt;span style="COLOR: black"&gt;'a'&lt;/span&gt;&lt;span style="COLOR: black"&gt;、&lt;/span&gt;&lt;span style="COLOR: black"&gt;'7'&lt;/span&gt;&lt;span style="COLOR: black"&gt;以及&lt;/span&gt;&lt;span style="COLOR: black"&gt;'M' &lt;/span&gt;&lt;span style="COLOR: black"&gt;所创建出来的一个表达式。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;/a7M/&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;等价的&lt;/span&gt;&lt;span style="COLOR: black"&gt;VBScript &lt;/span&gt;&lt;span style="COLOR: black"&gt;表达式为：&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;"a7M"&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 24pt"&gt;特殊字符：正则表达式简介（微软篇）之八特殊字符 &lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;有不少元字符在试图对其进行匹配时需要进行特殊的处理。要匹配这些特殊字符，必须首先将这些字符转义，也就是在前面使用一个反斜杠&lt;/span&gt;&lt;span style="COLOR: black"&gt;(\)&lt;/span&gt;&lt;span style="COLOR: black"&gt;。下表给出了这些特殊字符及其含义：&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;特殊字符&lt;/span&gt;&lt;span style="COLOR: black"&gt;说明&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;$ &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配输入字符串的结尾位置。如果设置了&lt;/span&gt;&lt;span style="COLOR: black"&gt;RegExp &lt;/span&gt;&lt;span style="COLOR: black"&gt;对象的&lt;/span&gt;&lt;span style="COLOR: black"&gt;Multiline&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;属性，则&lt;/span&gt;&lt;span style="COLOR: black"&gt;$ &lt;/span&gt;&lt;span style="COLOR: black"&gt;也匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;'\n' &lt;/span&gt;&lt;span style="COLOR: black"&gt;或&lt;/span&gt;&lt;span style="COLOR: black"&gt;'\r'&lt;/span&gt;&lt;span style="COLOR: black"&gt;。要匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;$ &lt;/span&gt;&lt;span style="COLOR: black"&gt;字符本身，请使用&lt;/span&gt;&lt;span style="COLOR: black"&gt;\$&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;( ) &lt;/span&gt;&lt;span style="COLOR: black"&gt;标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;要匹配这些字符，请使用&lt;/span&gt;&lt;span style="COLOR: black"&gt;\( &lt;/span&gt;&lt;span style="COLOR: black"&gt;和&lt;/span&gt;&lt;span style="COLOR: black"&gt;\)&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;* &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配前面的子表达式零次或多次。要匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;* &lt;/span&gt;&lt;span style="COLOR: black"&gt;字符，请使用&lt;/span&gt;&lt;span style="COLOR: black"&gt;\*&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;+ &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配前面的子表达式一次或多次。要匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;+ &lt;/span&gt;&lt;span style="COLOR: black"&gt;字符，请使用&lt;/span&gt;&lt;span style="COLOR: black"&gt;\+&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;. &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配除换行符&lt;/span&gt;&lt;span style="COLOR: black"&gt;\n&lt;/span&gt;&lt;span style="COLOR: black"&gt;之外的任何单字符。要匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;.&lt;/span&gt;&lt;span style="COLOR: black"&gt;，请使用&lt;/span&gt;&lt;span style="COLOR: black"&gt;\&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;标记一个中括号表达式的开始。要匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;[&lt;/span&gt;&lt;span style="COLOR: black"&gt;，请使用&lt;/span&gt;&lt;span style="COLOR: black"&gt;\[&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;? &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配前面的子表达式零次或一次，或指明一个非贪婪限定符。要匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;?&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;字符，请使用&lt;/span&gt;&lt;span style="COLOR: black"&gt;\?&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;\ &lt;/span&gt;&lt;span style="COLOR: black"&gt;将下一个字符标记为或特殊字符、或原义字符、或后向引用、或八进制&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;转义符。例如，&lt;/span&gt;&lt;span style="COLOR: black"&gt;'n' &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配字符&lt;/span&gt;&lt;span style="COLOR: black"&gt;'n'&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;'\n' &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配换行符。序列&lt;/span&gt;&lt;span style="COLOR: black"&gt;'\\' &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"\"&lt;/span&gt;&lt;span style="COLOR: black"&gt;，而&lt;/span&gt;&lt;span style="COLOR: black"&gt;'\(' &lt;/span&gt;&lt;span style="COLOR: black"&gt;则匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"("&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;^ &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配输入字符串的开始位置，除非在方括号表达式中使用，此时它表示&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;不接受该字符集合。要匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;^ &lt;/span&gt;&lt;span style="COLOR: black"&gt;字符本身，请使用&lt;/span&gt;&lt;span style="COLOR: black"&gt;\^&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;{ &lt;/span&gt;&lt;span style="COLOR: black"&gt;标记限定符表达式的开始。要匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;{&lt;/span&gt;&lt;span style="COLOR: black"&gt;，请使用&lt;/span&gt;&lt;span style="COLOR: black"&gt;\{&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;/div&gt;
&lt;br/&gt;&lt;div&gt;&lt;a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="_Toc145993316" id="_Toc145993316"&gt;&lt;span&gt;&lt;span&gt;&lt;span style="FONT-SIZE: 24pt"&gt;非打印字符：正则表达式简介（微软篇）之九非打印字符&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;有不少很有用的非打印字符，偶尔必须使用。下表显示了用来表示这些非打印字符的转义序列：&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;字符&lt;/span&gt;&lt;span style="COLOR: black"&gt;含义&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;\cx &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配由&lt;/span&gt;&lt;span style="COLOR: black"&gt;x&lt;/span&gt;&lt;span style="COLOR: black"&gt;指明的控制字符。例如，&lt;/span&gt;&lt;span style="COLOR: black"&gt;\cM &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配一个&lt;/span&gt;&lt;span style="COLOR: black"&gt;Control-M &lt;/span&gt;&lt;span style="COLOR: black"&gt;或回车符。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;x &lt;/span&gt;&lt;span style="COLOR: black"&gt;的值必须为&lt;/span&gt;&lt;span style="COLOR: black"&gt;A-Z &lt;/span&gt;&lt;span style="COLOR: black"&gt;或&lt;/span&gt;&lt;span style="COLOR: black"&gt;a-z &lt;/span&gt;&lt;span style="COLOR: black"&gt;之一。否则，将&lt;/span&gt;&lt;span style="COLOR: black"&gt;c &lt;/span&gt;&lt;span style="COLOR: black"&gt;视为一个原义的&lt;/span&gt;&lt;span style="COLOR: black"&gt;'c' &lt;/span&gt;&lt;span style="COLOR: black"&gt;字&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;符。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;\f &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配一个换页符。等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;\x0c &lt;/span&gt;&lt;span style="COLOR: black"&gt;和&lt;/span&gt;&lt;span style="COLOR: black"&gt;\cL&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;\n &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配一个换行符。等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;\x0a &lt;/span&gt;&lt;span style="COLOR: black"&gt;和&lt;/span&gt;&lt;span style="COLOR: black"&gt;\cJ&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;\r &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配一个回车符。等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;\x0d &lt;/span&gt;&lt;span style="COLOR: black"&gt;和&lt;/span&gt;&lt;span style="COLOR: black"&gt;\cM&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;\s &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配任何空白字符，包括空格、制表符、换页符等等。等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;[\f\n\r\t\v]&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;\S &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配任何非空白字符。等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;[^ \f\n\r\t\v]&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;\t &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配一个制表符。等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;\x09 &lt;/span&gt;&lt;span style="COLOR: black"&gt;和&lt;/span&gt;&lt;span style="COLOR: black"&gt;\cI&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;\v &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配一个垂直制表符。等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;\x0b &lt;/span&gt;&lt;span style="COLOR: black"&gt;和&lt;/span&gt;&lt;span style="COLOR: black"&gt;\cK&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 24pt"&gt;限定符：正则表达式简介（微软篇）之十一限定符 &lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;有时候不知道要匹配多少字符。为了能适应这种不确定性，正则表达式支持限定符的概念。这些限定符可以指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;下表给出了各种限定符及其含义的说明：&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;字符&lt;/span&gt;&lt;span style="COLOR: black"&gt;描述&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;* &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配前面的子表达式零次或多次。例如，&lt;/span&gt;&lt;span style="COLOR: black"&gt;zo* &lt;/span&gt;&lt;span style="COLOR: black"&gt;能匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"z" &lt;/span&gt;&lt;span style="COLOR: black"&gt;以及&lt;/span&gt;&lt;span style="COLOR: black"&gt;"zoo"&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;* &lt;/span&gt;&lt;span style="COLOR: black"&gt;等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;{0,}&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;+ &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配前面的子表达式一次或多次。例如，&lt;/span&gt;&lt;span style="COLOR: black"&gt;'zo+' &lt;/span&gt;&lt;span style="COLOR: black"&gt;能匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"zo" &lt;/span&gt;&lt;span style="COLOR: black"&gt;以&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;及&lt;/span&gt;&lt;span style="COLOR: black"&gt;"zoo"&lt;/span&gt;&lt;span style="COLOR: black"&gt;，但不能匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"z"&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;+ &lt;/span&gt;&lt;span style="COLOR: black"&gt;等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;{1,}&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;? &lt;/span&gt;&lt;span style="COLOR: black"&gt;匹配前面的子表达式零次或一次。例如，&lt;/span&gt;&lt;span style="COLOR: black"&gt;"do(es)?" &lt;/span&gt;&lt;span style="COLOR: black"&gt;可以匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"do"&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;或&lt;/span&gt;&lt;span style="COLOR: black"&gt;"does" &lt;/span&gt;&lt;span style="COLOR: black"&gt;中的&lt;/span&gt;&lt;span style="COLOR: black"&gt;"do" &lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;? &lt;/span&gt;&lt;span style="COLOR: black"&gt;等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;{0,1}&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;{n} n &lt;/span&gt;&lt;span style="COLOR: black"&gt;是一个非负整数。匹配确定的&lt;/span&gt;&lt;span style="COLOR: black"&gt;n &lt;/span&gt;&lt;span style="COLOR: black"&gt;次。例如，&lt;/span&gt;&lt;span style="COLOR: black"&gt;'o{2}' &lt;/span&gt;&lt;span style="COLOR: black"&gt;不能匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"Bob"&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;中的&lt;/span&gt;&lt;span style="COLOR: black"&gt;'o'&lt;/span&gt;&lt;span style="COLOR: black"&gt;，但是能匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"food" &lt;/span&gt;&lt;span style="COLOR: black"&gt;中的两个&lt;/span&gt;&lt;span style="COLOR: black"&gt;o&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;{n,} n &lt;/span&gt;&lt;span style="COLOR: black"&gt;是一个非负整数。至少匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;n &lt;/span&gt;&lt;span style="COLOR: black"&gt;次。例如，&lt;/span&gt;&lt;span style="COLOR: black"&gt;'o{2,}' &lt;/span&gt;&lt;span style="COLOR: black"&gt;不能匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"Bob" &lt;/span&gt;&lt;span style="COLOR: black"&gt;中&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;的&lt;/span&gt;&lt;span style="COLOR: black"&gt;'o'&lt;/span&gt;&lt;span style="COLOR: black"&gt;，但能匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"foooood" &lt;/span&gt;&lt;span style="COLOR: black"&gt;中的所有&lt;/span&gt;&lt;span style="COLOR: black"&gt;o&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;'o{1,}' &lt;/span&gt;&lt;span style="COLOR: black"&gt;等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;'o+'&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;'o&lt;br/&gt;{0,}' &lt;/span&gt;&lt;span style="COLOR: black"&gt;则等价于&lt;/span&gt;&lt;span style="COLOR: black"&gt;'o*'&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;{n,m} m &lt;/span&gt;&lt;span style="COLOR: black"&gt;和&lt;/span&gt;&lt;span style="COLOR: black"&gt;n &lt;/span&gt;&lt;span style="COLOR: black"&gt;均为非负整数，其中&lt;/span&gt;&lt;span style="COLOR: black"&gt;n &amp;lt;= m&lt;/span&gt;&lt;span style="COLOR: black"&gt;。最少匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;n &lt;/span&gt;&lt;span style="COLOR: black"&gt;次且最多匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;m &lt;/span&gt;&lt;span style="COLOR: black"&gt;次。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;刘，&lt;/span&gt;&lt;span style="COLOR: black"&gt;"o{1,3}" &lt;/span&gt;&lt;span style="COLOR: black"&gt;将匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;"fooooood" &lt;/span&gt;&lt;span style="COLOR: black"&gt;中的前三个&lt;/span&gt;&lt;span style="COLOR: black"&gt;o&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;'o{0,1}' &lt;/span&gt;&lt;span style="COLOR: black"&gt;等价&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;于&lt;/span&gt;&lt;span style="COLOR: black"&gt;'o?'&lt;/span&gt;&lt;span style="COLOR: black"&gt;。请注意在逗号和两个数之间不能有空格。&lt;/span&gt;&lt;/div&gt;
&lt;br/&gt;&lt;div style="TEXT-ALIGN: left; MARGIN-BOTTOM: 12pt"&gt;&lt;span style="COLOR: black"&gt;对一个很大的输入文档而言，章节数很轻易就超过九章，因此需要有一种方法来处理两位数或者三位数的章节号。限定符就提供了这个功能。下面的Visual Basic Scripting Edition 正则表达式可以匹配具有任何位数的章节标题：&lt;br/&gt;&lt;br/&gt;/Chapter [1-9][0-9]*/&lt;br/&gt;&lt;br/&gt;下面的 VBScript 正则表达式执行同样的匹配：&lt;br/&gt;&lt;br/&gt;"Chapter [1-9][0-9]*"&lt;br/&gt;&lt;br/&gt;请注意限定符出现在范围表达式之后。因此，它将应用于所包含的整个范围表达式，在本例中，只指定了从 0 到 9 的数字。&lt;br/&gt;&lt;br/&gt;这里没有使用 '+' 限定符，因为第二位或后续位置上并不一定需要一个数字。同样也没有使用 '?' 字符，因为这将把章节数限制为只有两位数字。在 'Chapter' 和空格字符之后至少要匹配一个数字。&lt;br/&gt;&lt;br/&gt;如果已知章节数限制只有99 章，则可以使用下面的 Visual Basic Scripting Edition 表达式来指定至少有一位数字，但不超过两个数字。&lt;br/&gt;&lt;br/&gt;/Chapter [0-9]{1,2}/&lt;br/&gt;&lt;br/&gt;对 VBScript 可以使用下述正则表达式：&lt;br/&gt;&lt;br/&gt;"Chapter [0-9]{1,2}"&lt;br/&gt;&lt;br/&gt;上述表达式的缺点是如果有一个章节号大于 99，它仍只会匹配前两位数字。另一个缺点是某些人可以创建一个 Chapter 0，而且仍能匹配。一个更好的用来匹配两位数的 Visual Basic Scripting Edition 表达式如下：&lt;br/&gt;&lt;br/&gt;/Chapter [1-9][0-9]?/&lt;br/&gt;&lt;br/&gt;或者&lt;br/&gt;&lt;br/&gt;/Chapter [1-9][0-9]{0,1}/&lt;br/&gt;&lt;br/&gt;对 VBScript 而言，下述表达式与上面等价：&lt;br/&gt;&lt;br/&gt;"Chapter [1-9][0-9]?"&lt;br/&gt;&lt;br/&gt;或者&lt;br/&gt;&lt;br/&gt;"Chapter [1-9][0-9]{0,1}"&lt;br/&gt;&lt;br/&gt;'*'、 '+'和 '?' 限定符都称之为贪婪的，也就是说，他们尽可能多地匹配文字。有时这根本就不是所希望发生的情况。有时则正好希望最小匹配。&lt;br/&gt;&lt;br/&gt;例如，你可能要搜索一个 HTML 文档来查找一处包含在 H1 标记中的章节标题。在文档中该文字可能具有如下形式：&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Chapter 1 - Introduction to Regular Expressions&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;下面的表达式匹配从开始的小于号 (&amp;lt;) 到 H1 标记结束处的大于号之间的所有内容。&lt;br/&gt;&lt;br/&gt;/&amp;lt;.*&amp;gt;/&lt;br/&gt;&lt;br/&gt;VBScript 的正则表达式为：&lt;br/&gt;&lt;br/&gt;"&amp;lt;.*&amp;gt;"&lt;/span&gt;&lt;/div&gt;
&lt;br/&gt;&lt;div&gt;&lt;span style="COLOR: black"&gt;如果所要匹配的就是开始的&lt;/span&gt;&lt;span style="COLOR: black"&gt;H1 &lt;/span&gt;&lt;span style="COLOR: black"&gt;标记，则下述非贪婪地表达式就只匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;/&amp;lt;.*?&amp;gt;/&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;或者&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;"&amp;lt;.*?&amp;gt;"&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;通过在&lt;/span&gt;&lt;span style="COLOR: black"&gt;'*'&lt;/span&gt;&lt;span style="COLOR: black"&gt;、&lt;/span&gt;&lt;span style="COLOR: black"&gt;'+' &lt;/span&gt;&lt;span style="COLOR: black"&gt;或&lt;/span&gt;&lt;span style="COLOR: black"&gt;'?' &lt;/span&gt;&lt;span style="COLOR: black"&gt;限定符后放置&lt;/span&gt;&lt;span style="COLOR: black"&gt;'?'&lt;/span&gt;&lt;span style="COLOR: black"&gt;，该表达式就从贪婪匹配转为了非贪婪或最小匹配。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 24pt"&gt;选择与编组：正则表达式简介（微软篇）之十三选择与编组 &lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;选择允许使用&lt;/span&gt;&lt;span style="COLOR: black"&gt;'&lt;/span&gt;&lt;span style="COLOR: black"&gt;　&lt;/span&gt;&lt;span style="COLOR: black"&gt;' &lt;/span&gt;&lt;span style="COLOR: black"&gt;字符来在两个或多个候选项中进行选择。通过扩展章节标题的正则表达式，可以将其扩充为不仅仅适用于章节标题的表达式。不过，这可没有想象的那么直接。在使用选择时，将匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;'&lt;/span&gt;&lt;span style="COLOR: black"&gt;　&lt;/span&gt;&lt;span style="COLOR: black"&gt;' &lt;/span&gt;&lt;span style="COLOR: black"&gt;字符每边最可能的表达式。你可能认为下面的&lt;/span&gt;&lt;span style="COLOR: black"&gt;Visual Basic Scripting Edition &lt;/span&gt;&lt;span style="COLOR: black"&gt;和&lt;/span&gt;&lt;span style="COLOR: black"&gt;VBScript &lt;/span&gt;&lt;span style="COLOR: black"&gt;表达式将匹配位于一行的开始和结束位置且后跟一个或两个数字的&lt;/span&gt;&lt;span style="COLOR: black"&gt;'Chapter' &lt;/span&gt;&lt;span style="COLOR: black"&gt;或&lt;/span&gt;&lt;span style="COLOR: black"&gt;'Section'&lt;/span&gt;&lt;span style="COLOR: black"&gt;：&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;/^Chapter&lt;/span&gt;&lt;span style="COLOR: black"&gt;　&lt;/span&gt;&lt;span style="COLOR: black"&gt;Section [1-9][0-9]{0,1}$/&lt;br/&gt;"^Chapter&lt;/span&gt;&lt;span style="COLOR: black"&gt;　&lt;/span&gt;&lt;span style="COLOR: black"&gt;Section [1-9][0-9]{0,1}$"&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;不幸的是，真正的情况是上面所示的正则表达式要么匹配位于一行开始处的单词&lt;/span&gt;&lt;span style="COLOR: black"&gt;'Chapter'&lt;/span&gt;&lt;span style="COLOR: black"&gt;，要么匹配一行结束处的后跟任何数字的&lt;/span&gt;&lt;span style="COLOR: black"&gt;'Section'&lt;/span&gt;&lt;span style="COLOR: black"&gt;。如果输入字符串为&lt;/span&gt;&lt;span style="COLOR: black"&gt;'Chapter 22'&lt;/span&gt;&lt;span style="COLOR: black"&gt;，上面的表达式将只匹配单词&lt;/span&gt;&lt;span style="COLOR: black"&gt;'Chapter'&lt;/span&gt;&lt;span style="COLOR: black"&gt;。如果输入字符串为&lt;/span&gt;&lt;span style="COLOR: black"&gt;'Section 22'&lt;/span&gt;&lt;span style="COLOR: black"&gt;，则该表达式将匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;'Section 22'&lt;/span&gt;&lt;span style="COLOR: black"&gt;。但这种结果不是我们此处的目的，因此必须有一种办法来使正则表达式对于所要做的更易于响应，而且确实也有这种方法。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;可以使用圆括号来限制选择的范围，也就是说明确该选择只适用于这两个单词&lt;/span&gt;&lt;span style="COLOR: black"&gt;'Chapter' &lt;/span&gt;&lt;span style="COLOR: black"&gt;和&lt;/span&gt;&lt;span style="COLOR: black"&gt;'Section'&lt;/span&gt;&lt;span style="COLOR: black"&gt;。不过，圆括号同样也是难处理的，因为它们也用来创建子表达式，有些内容将在后面关于子表达式的部分介绍。通过采用上面所示的正则表达式并在适当位置添加圆括号，就可以使该正则表达式既可以匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;'Chapter 1'&lt;/span&gt;&lt;span style="COLOR: black"&gt;，也可以匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;'Section 3'&lt;/span&gt;&lt;span style="COLOR: black"&gt;。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;下面的正则表达式使用圆括号将&lt;/span&gt;&lt;span style="COLOR: black"&gt;'Chapter' &lt;/span&gt;&lt;span style="COLOR: black"&gt;和&lt;/span&gt;&lt;span style="COLOR: black"&gt;'Section' &lt;/span&gt;&lt;span style="COLOR: black"&gt;组成一组，所以该表达式才能正确工作。对&lt;/span&gt;&lt;span style="COLOR: black"&gt;Visual Basic Scripting Edition &lt;/span&gt;&lt;span style="COLOR: black"&gt;为：&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;/^(Chapter&lt;/span&gt;&lt;span style="COLOR: black"&gt;　&lt;/span&gt;&lt;span style="COLOR: black"&gt;Section) [1-9][0-9]{0,1}$/&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;对&lt;/span&gt;&lt;span style="COLOR: black"&gt;VBScript &lt;/span&gt;&lt;span style="COLOR: black"&gt;为：&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;"^(Chapter&lt;/span&gt;&lt;span style="COLOR: black"&gt;　&lt;/span&gt;&lt;span style="COLOR: black"&gt;Section) [1-9][0-9]{0,1}$"&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;这些表达式工作正确，只是产生了一个有趣的副产品。在&lt;/span&gt;&lt;span style="COLOR: black"&gt;'Chapter&lt;/span&gt;&lt;span style="COLOR: black"&gt;　&lt;/span&gt;&lt;span style="COLOR: black"&gt;Section' &lt;/span&gt;&lt;span style="COLOR: black"&gt;两边放置圆括号建立了适当的编组，但也导致两个待匹配单词之一都被捕获供今后使用。由于在上面所示的表达式中只有一组圆括号，因此只能有一个捕获的&lt;/span&gt;&lt;span style="COLOR: black"&gt;submatch&lt;/span&gt;&lt;span style="COLOR: black"&gt;。可以使用&lt;/span&gt;&lt;span style="COLOR: black"&gt;VBScript &lt;/span&gt;&lt;span style="COLOR: black"&gt;的&lt;/span&gt;&lt;span style="COLOR: black"&gt;Submatches &lt;/span&gt;&lt;span style="COLOR: black"&gt;集合或者&lt;/span&gt;&lt;span style="COLOR: black"&gt;Visual Basic Scripting Edition &lt;/span&gt;&lt;span style="COLOR: black"&gt;中&lt;/span&gt;&lt;span style="COLOR: black"&gt;RegExp &lt;/span&gt;&lt;span style="COLOR: black"&gt;对象的&lt;/span&gt;&lt;span style="COLOR: black"&gt;$1-$9 &lt;/span&gt;&lt;span style="COLOR: black"&gt;属性来引用这个子匹配。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;有时捕获一个子匹配是所希望的，有时则是不希望的。在说明所示的示例中，真正想做的就是使用圆括号对单词&lt;/span&gt;&lt;span style="COLOR: black"&gt;'Chapter' &lt;/span&gt;&lt;span style="COLOR: black"&gt;或&lt;/span&gt;&lt;span style="COLOR: black"&gt;'Section' &lt;/span&gt;&lt;span style="COLOR: black"&gt;之间的选择编组。并不希望在后面再引用该匹配。实际上，除非真的是需要捕获子匹配，否则请不要使用。由于不需要花时间和内存来存储那些子匹配，这种正则表达式的效率将更高。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;可以在正则表达式模式圆括号内部的前面使用&lt;/span&gt;&lt;span style="COLOR: black"&gt;'?:'&lt;/span&gt;&lt;span style="COLOR: black"&gt;来防止存储该匹配供今后使用。对上面所示正则表达式的下述修改提供了免除子匹配存储的相同功能。对&lt;/span&gt;&lt;span style="COLOR: black"&gt;Visual Basic Scripting Edition&lt;/span&gt;&lt;span style="COLOR: black"&gt;：&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;/^(?:Chapter&lt;/span&gt;&lt;span style="COLOR: black"&gt;　&lt;/span&gt;&lt;span style="COLOR: black"&gt;Section) [1-9][0-9]{0,1}$/&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;对&lt;/span&gt;&lt;span style="COLOR: black"&gt;VBScript&lt;/span&gt;&lt;span style="COLOR: black"&gt;：&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;"^(?:Chapter&lt;/span&gt;&lt;span style="COLOR: black"&gt;　&lt;/span&gt;&lt;span style="COLOR: black"&gt;Section) [1-9][0-9]{0,1}$"&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;除了&lt;/span&gt;&lt;span style="COLOR: black"&gt;'?:' &lt;/span&gt;&lt;span style="COLOR: black"&gt;元字符，还有两个非捕获元字符用于称之为预查的匹配。一个为正向预查，用&lt;/span&gt;&lt;span style="COLOR: black"&gt;?= &lt;/span&gt;&lt;span style="COLOR: black"&gt;表示，&lt;/span&gt;&lt;span style="COLOR: black"&gt;在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串。一个为负向预查，用&lt;/span&gt;&lt;span style="COLOR: black"&gt;'?!' &lt;/span&gt;&lt;span style="COLOR: black"&gt;表示，在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。&lt;/span&gt;&lt;/div&gt;
&lt;br/&gt;&lt;div&gt;&lt;span style="COLOR: black"&gt;例如，假定有一个包含引用有&lt;/span&gt;&lt;span style="COLOR: black"&gt;Windows 3.1&lt;/span&gt;&lt;span style="COLOR: black"&gt;、&lt;/span&gt;&lt;span style="COLOR: black"&gt;Windows 95&lt;/span&gt;&lt;span style="COLOR: black"&gt;、&lt;/span&gt;&lt;span style="COLOR: black"&gt;Windows 98 &lt;/span&gt;&lt;span style="COLOR: black"&gt;以及&lt;/span&gt;&lt;span style="COLOR: black"&gt;Windows NT &lt;/span&gt;&lt;span style="COLOR: black"&gt;的文档。进一步假设需要更新该文档，方法是查找所有对&lt;/span&gt;&lt;span style="COLOR: black"&gt;Windows 95&lt;/span&gt;&lt;span style="COLOR: black"&gt;、&lt;/span&gt;&lt;span style="COLOR: black"&gt;Windows 98 &lt;/span&gt;&lt;span style="COLOR: black"&gt;以及&lt;/span&gt;&lt;span style="COLOR: black"&gt;Windows NT &lt;/span&gt;&lt;span style="COLOR: black"&gt;的引用，并将这些引用更改为&lt;/span&gt;&lt;span style="COLOR: black"&gt;Windows 2000&lt;/span&gt;&lt;span style="COLOR: black"&gt;。可以使用下面的&lt;/span&gt;&lt;span style="COLOR: black"&gt;Visual Basic Scripting Edition &lt;/span&gt;&lt;span style="COLOR: black"&gt;正则表达式，这是一个正向预查，来匹配&lt;/span&gt;&lt;span style="COLOR: black"&gt;Windows 95&lt;/span&gt;&lt;span style="COLOR: black"&gt;、&lt;/span&gt;&lt;span style="COLOR: black"&gt;Windows 98 &lt;/span&gt;&lt;span style="COLOR: black"&gt;以及&lt;/span&gt;&lt;span style="COLOR: black"&gt;Windows NT&lt;/span&gt;&lt;span style="COLOR: black"&gt;：&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;/Windows(?=95 &lt;/span&gt;&lt;span style="COLOR: black"&gt;　&lt;/span&gt;&lt;span style="COLOR: black"&gt;98 &lt;/span&gt;&lt;span style="COLOR: black"&gt;　&lt;/span&gt;&lt;span style="COLOR: black"&gt;NT )/&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;在&lt;/span&gt;&lt;span style="COLOR: black"&gt;VBScript &lt;/span&gt;&lt;span style="COLOR: black"&gt;要进行同样的匹配可以使用下述表达式：&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;"Windows(?=95 &lt;/span&gt;&lt;span style="COLOR: black"&gt;　&lt;/span&gt;&lt;span style="COLOR: black"&gt;98 &lt;/span&gt;&lt;span style="COLOR: black"&gt;　&lt;/span&gt;&lt;span style="COLOR: black"&gt;NT )"&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;找到一个匹配后，紧接匹配到的文字（而不包括预查中使用的字符）就开始对下一次匹配的搜索。例如，如果上面所示的表达式匹配到&lt;/span&gt;&lt;span style="COLOR: black"&gt;'Windows 98'&lt;/span&gt;&lt;span style="COLOR: black"&gt;，则将从&lt;/span&gt;&lt;span style="COLOR: black"&gt;'Windows' &lt;/span&gt;&lt;span style="COLOR: black"&gt;而不是&lt;/span&gt;&lt;span style="COLOR: black"&gt;'98' &lt;/span&gt;&lt;span style="COLOR: black"&gt;之后继续查找。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 24pt"&gt;后向引用：正则表达式简介（微软篇）之十四后向引用 &lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;正则表达式一个最重要的特性就是将匹配成功的模式的某部分进行存储供以后使用这一能力。请回想一下，对一个正则表达式模式或部分模式两边添加圆括号将导致这部分表达式存储到一个临时缓冲区中。可以使用非捕获元字符&lt;/span&gt;&lt;span style="COLOR: black"&gt;'?:', '?=', or '?!' &lt;/span&gt;&lt;span style="COLOR: black"&gt;来忽略对这部分正则表达式的保存。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从&lt;/span&gt;&lt;span style="COLOR: black"&gt;1 &lt;/span&gt;&lt;span style="COLOR: black"&gt;开始，连续编号直至最大&lt;/span&gt;&lt;span style="COLOR: black"&gt;99 &lt;/span&gt;&lt;span style="COLOR: black"&gt;个子表达式。每个缓冲区都可以使用&lt;/span&gt;&lt;span style="COLOR: black"&gt;'\n' &lt;/span&gt;&lt;span style="COLOR: black"&gt;访问，其中&lt;/span&gt;&lt;span style="COLOR: black"&gt;n &lt;/span&gt;&lt;span style="COLOR: black"&gt;为一个标识特定缓冲区的一位或两位十进制数。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;后向引用一个最简单，最有用的应用是提供了确定文字中连续出现两个相同单词的位置的能力。请看下面的句子：&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;Is is the cost of of gasoline going up up?&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;根据所写内容，上面的句子明显存在单词多次重复的问题。如果能有一种方法无需查找每个单词的重复现象就能修改该句子就好了。下面的&lt;/span&gt;&lt;span style="COLOR: black"&gt;Visual Basic Scripting Edition &lt;/span&gt;&lt;span style="COLOR: black"&gt;正则表达式使用一个子表达式就可以实现这一功能。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;/\b([a-z]+) \1\b/gi&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;等价的&lt;/span&gt;&lt;span style="COLOR: black"&gt;VBScript &lt;/span&gt;&lt;span style="COLOR: black"&gt;表达式为：&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;"\b([a-z]+) \1\b"&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;在这个示例中，子表达式就是圆括号之间的每一项。所捕获的表达式包括一个或多个字母字符，即由&lt;/span&gt;&lt;span style="COLOR: black"&gt;'[a-z]+' &lt;/span&gt;&lt;span style="COLOR: black"&gt;所指定的。该正则表达式的第二部分是对前面所捕获的子匹配的引用，也就是由附加表达式所匹配的第二次出现的单词。&lt;/span&gt;&lt;span style="COLOR: black"&gt;'\1'&lt;/span&gt;&lt;span style="COLOR: black"&gt;用来指定第一个子匹配。单词边界元字符确保只检测单独的单词。如果不这样，则诸如&lt;/span&gt;&lt;span style="COLOR: black"&gt;"is issued" &lt;/span&gt;&lt;span style="COLOR: black"&gt;或&lt;/span&gt;&lt;span style="COLOR: black"&gt;"this is" &lt;/span&gt;&lt;span style="COLOR: black"&gt;这样的短语都会被该表达式不正确地识别。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;在&lt;/span&gt;&lt;span style="COLOR: black"&gt;Visual Basic Scripting Edition &lt;/span&gt;&lt;span style="COLOR: black"&gt;表达式中，正则表达式后面的全局标志&lt;/span&gt;&lt;span style="COLOR: black"&gt;('g') &lt;/span&gt;&lt;span style="COLOR: black"&gt;表示该表达式将用来在输入字符串中查找尽可能多的匹配。大小写敏感性由表达式结束处的大小写敏感性标记&lt;/span&gt;&lt;span style="COLOR: black"&gt;('i') &lt;/span&gt;&lt;span style="COLOR: black"&gt;指定。多行标记指定可能出现在换行符的两端的潜在匹配。对&lt;/span&gt;&lt;span style="COLOR: black"&gt;VBScript &lt;/span&gt;&lt;span style="COLOR: black"&gt;而言，在表达式中不能设置各种标记，但必须使用&lt;/span&gt;&lt;span style="COLOR: black"&gt;RegExp &lt;/span&gt;&lt;span style="COLOR: black"&gt;对象的属性来显式设置。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;使用上面所示的正则表达式，下面的&lt;/span&gt;&lt;span style="COLOR: black"&gt;Visual Basic Scripting Edition &lt;/span&gt;&lt;span style="COLOR: black"&gt;代码可以使用子匹配信息，在一个文字字符串中将连续出现两次的相同单词替换为一个相同的单词：&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;var ss = "Is is the cost of of gasoline going up up?.\n";&lt;br/&gt;var re = /\b([a-z]+) \1\b/gim; //&lt;/span&gt;&lt;span style="COLOR: black"&gt;创建正则表达式样式&lt;/span&gt;&lt;span style="COLOR: black"&gt;.&lt;br/&gt;var rv = ss.replace(re,"$1"); //&lt;/span&gt;&lt;span style="COLOR: black"&gt;用一个单词替代两个单词&lt;/span&gt;&lt;span style="COLOR: black"&gt;.&lt;/span&gt;&lt;/div&gt;
&lt;br/&gt;&lt;div&gt;&lt;span style="COLOR: black"&gt;最接近的等价&lt;/span&gt;&lt;span style="COLOR: black"&gt;VBScript &lt;/span&gt;&lt;span style="COLOR: black"&gt;代码如下：&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;Dim ss, re, rv&lt;br/&gt;ss = "Is is the cost of of gasoline going up up?." &amp;amp; vbNewLine&lt;br/&gt;Set re = New RegExp&lt;br/&gt;re.Pattern = "\b([a-z]+) \1\b"&lt;br/&gt;re.Global = True&lt;br/&gt;re.IgnoreCase = True&lt;br/&gt;re.MultiLine = True&lt;br/&gt;rv = re.Replace(ss,"$1")&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;请注意在&lt;/span&gt;&lt;span style="COLOR: black"&gt;VBScript &lt;/span&gt;&lt;span style="COLOR: black"&gt;代码中，全局、大小写敏感性以及多行标记都是使用&lt;/span&gt;&lt;span style="COLOR: black"&gt;RegExp &lt;/span&gt;&lt;span style="COLOR: black"&gt;对象的适当属性来设置的。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;在&lt;/span&gt;&lt;span style="COLOR: black"&gt;replace &lt;/span&gt;&lt;span style="COLOR: black"&gt;方法中使用&lt;/span&gt;&lt;span style="COLOR: black"&gt;$1 &lt;/span&gt;&lt;span style="COLOR: black"&gt;来引用所保存的第一个子匹配。如果有多个子匹配，则可以用&lt;/span&gt;&lt;span style="COLOR: black"&gt;$2, $3 &lt;/span&gt;&lt;span style="COLOR: black"&gt;等继续引用。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;后向引用的另一个用途是将一个通用资源指示符&lt;/span&gt;&lt;span style="COLOR: black"&gt;(URI) &lt;/span&gt;&lt;span style="COLOR: black"&gt;分解为组件部分。假定希望将下述的&lt;/span&gt;&lt;span style="COLOR: black"&gt;URI &lt;/span&gt;&lt;span style="COLOR: black"&gt;分解为协议&lt;/span&gt;&lt;span style="COLOR: black"&gt;(ftp, http, etc)&lt;/span&gt;&lt;span style="COLOR: black"&gt;，域名地址以及页面&lt;/span&gt;&lt;span style="COLOR: black"&gt;/&lt;/span&gt;&lt;span style="COLOR: black"&gt;路径：&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;http://msdn.microsoft.com:80/scripting/default.htm&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;下面的正则表达式可以提供这个功能。对&lt;/span&gt;&lt;span style="COLOR: black"&gt;Visual Basic Scripting Edition&lt;/span&gt;&lt;span style="COLOR: black"&gt;，为：&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;对&lt;/span&gt;&lt;span style="COLOR: black"&gt;VBScript &lt;/span&gt;&lt;span style="COLOR: black"&gt;为：&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;"(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)"&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;第一个附加子表达式是用来捕获该&lt;/span&gt;&lt;span style="COLOR: black"&gt;web &lt;/span&gt;&lt;span style="COLOR: black"&gt;地址的协议部分。该子表达式匹配位于一个冒号和两个正斜杠之前的任何单词。第二个附加子表达式捕获该地址的域名地址。该子表达式匹配不包括&lt;/span&gt;&lt;span style="COLOR: black"&gt;'^'&lt;/span&gt;&lt;span style="COLOR: black"&gt;、&lt;/span&gt;&lt;span style="COLOR: black"&gt;'/' &lt;/span&gt;&lt;span style="COLOR: black"&gt;或&lt;/span&gt;&lt;span style="COLOR: black"&gt;':' &lt;/span&gt;&lt;span style="COLOR: black"&gt;字符的任何字符序列。第三个附加子表达式捕获网站端口号码，如果指定了该端口号。该子表达式匹配后跟一个冒号的零或多个数字。最后，第四个附加子表达式捕获由该&lt;/span&gt;&lt;span style="COLOR: black"&gt;web &lt;/span&gt;&lt;span style="COLOR: black"&gt;地址指定的路径以及&lt;/span&gt;&lt;span style="COLOR: black"&gt;\&lt;/span&gt;&lt;span style="COLOR: black"&gt;或者页面信息。该子表达式匹配一个和多个除&lt;/span&gt;&lt;span style="COLOR: black"&gt;'#' &lt;/span&gt;&lt;span style="COLOR: black"&gt;或空格之外的字符。&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="COLOR: black"&gt;将该正则表达式应用于上面所示的&lt;/span&gt;&lt;span style="COLOR: black"&gt;URI &lt;/span&gt;&lt;span style="COLOR: black"&gt;后，子匹配包含下述内容：&lt;/span&gt;&lt;span style="COLOR: black"&gt;&lt;br/&gt;&lt;br/&gt;RegExp.$1 &lt;/span&gt;&lt;span style="COLOR: black"&gt;包含&lt;/span&gt;&lt;span style="COLOR: black"&gt;"http"&lt;br/&gt;&lt;br/&gt;RegExp.$2 &lt;/span&gt;&lt;span style="COLOR: black"&gt;包含&lt;/span&gt;&lt;span style="COLOR: black"&gt;"msdn.microsoft.com"&lt;br/&gt;&lt;br/&gt;RegExp.$3 &lt;/span&gt;&lt;span style="COLOR: black"&gt;包含&lt;/span&gt;&lt;span style="COLOR: black"&gt;":80"&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="COLOR: black"&gt;转自:&lt;a href="http://blog.csdn.net/sheismylife/archive/2006/09/14/1221426.aspx"&gt;http://blog.csdn.net/sheismylife/archive/2006/09/14/1221426.aspx&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p &gt;&lt;!-- Tag links generated by Zoundry Blog Writer. Do not manually edit. http://www.zoundry.com --&gt;
  &lt;span &gt;&lt;span &gt;Technorati&lt;/span&gt; : &lt;a href="http://technorati.com/tag/%E5%BE%AE%E8%BD%AF%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F"  rel="tag"&gt;微软正则表达式&lt;/a&gt;, &lt;a href="http://technorati.com/tag/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F"  rel="tag"&gt;正则表达式&lt;/a&gt;&lt;/span&gt; 
&lt;/p&gt;&lt;img src="http://www.cnblogs.com/wuhen/aggbug/2054955.html?type=2" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wuhen/articles/2054955.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wuhen/articles/2046856.html</id><title type="text">firefox 变慢解决方法,firefox 加速解决方法,Firefox启动慢等问题解决办法</title><summary type="text">firefox 变慢解决方法,firefox 加速解决方法,Firefox启动慢等问题解决办法</summary><published>2011-05-15T05:44:00Z</published><updated>2011-05-15T05:44:00Z</updated><author><name>JOY</name><uri>http://www.cnblogs.com/wuhen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wuhen/articles/2046856.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wuhen/articles/2046856.html"/><content type="html">&lt;div &gt;&#xD;
firefox 变慢解决方法,firefox 加速解决方法,Firefox启动慢等问题解决办法&lt;/div&gt;&#xD;
&lt;div id="blog_text" &gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a target="_blank" href="http://www.firefoxapple.cn/"&gt;firefox优化&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;总共四个步骤，另加一项（第五步，可选）&lt;/p&gt;&#xD;
&lt;p&gt;第一步 如何加快浏览速度&lt;br /&gt;&#xD;
首先在浏览器地址栏里输入&amp;ldquo;about:config&amp;rdquo;，等系统调用完毕之后按照下列步骤 ：&lt;br /&gt;&#xD;
（1）更改　"network.http.pipelining"　为　ture&lt;br /&gt;&#xD;
（2）更改　"network.http.proxy.pipelining"  ture&lt;br /&gt;&#xD;
（3）更改　"network.http.pipelining.maxrequests"为8，意思是同时可以接受8条申请&lt;/p&gt;&#xD;
&lt;p&gt;第二步 如何减少Firefox(&lt;a target="_blank" href="http://www.firefoxapple.cn/"&gt;火狐&lt;/a&gt;)的内存占用量&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;输入about:config --〉点击右键，new-integer（整数） --〉输入 browser.cache.memory.capacity ---〉ok  --〉输入数值，推荐16000。&lt;/p&gt;&#xD;
&lt;p&gt;第三步  如何加速Firefox的启动速度&lt;/p&gt;&#xD;
&lt;p&gt;做法简单，右键点击你的桌面上firefox快捷方式，&amp;ldquo;属性&amp;rdquo;&amp;mdash;&amp;gt;&amp;ldquo;快捷方式&amp;rdquo;&amp;mdash;&amp;gt;&amp;ldquo;目标&amp;rdquo;，加参数&amp;ldquo;  &#xD;
/Prefetch:1&amp;rdquo;。即："D:\Program Files\Mozilla Ffox\firefox.exe" &#xD;
/Prefetch:1&amp;rdquo;（注意：&amp;ldquo;/&amp;rdquo;前有空格。 &#xD;
这个D：是笔者Firefox的安装位置，请你根据自己的安装位置来，不要傻呼呼的连这也要问我呀。）&lt;/p&gt;&#xD;
&lt;p&gt;第四步  设置信息反应&lt;/p&gt;&#xD;
&lt;p&gt;最后一步就是在Firefox再次输入&amp;ldquo;about:config&amp;rdquo;，在页面任何一个地方点右键，选择&amp;ldquo;New&amp;rdquo;&amp;mdash;&amp;ldquo;Integer&amp;rdquo;在 &#xD;
弹出的对话框中输入 &amp;ldquo;nglayout.initialpaint.delay&amp;rdquo;并将其值改为&amp;ldquo;0&amp;rdquo;，表示当浏览器收到网站回复的信息后 &#xD;
能够快速的反应。&lt;/p&gt;&#xD;
&lt;p&gt;第五步 另外&lt;/p&gt;&#xD;
&lt;p&gt;装了那个tabs插件以后 &lt;a target="_blank" href="http://www.firefoxapple.cn/"&gt;firefox启动&lt;/a&gt;慢了很多,要好几秒 钟，让人难以忍受，其实firefox自身的简单设置其实完全可以摆脱TAB插件，实现完全在同一个firefox 窗口中浏览 了。&lt;/p&gt;&#xD;
&lt;p&gt;（1）在firefox地址栏里输入"about:config"打开设置&lt;br /&gt;&#xD;
（2）找 到"browser.tabs.showsinglewindowmodeprefs" 双击修改其值为"True"&lt;br /&gt;&#xD;
（3）打开firefox的Options(选项) 高 级选项卡，找到标签页浏览设置，启用&amp;ldquo;强制打开新窗口的链接在下面打开&amp;rdquo;，选择子项中的&amp;ldquo;新标签页&amp;rdquo;。&lt;/p&gt;&#xD;
&lt;p&gt;*此外 browser.tabs.loaddivertedinbackground 选项可以改变新tab的载入方式，前台或者后台&lt;br /&gt;&#xD;
True=在后 台打开连接； False=在前台打开连接&lt;br /&gt;&#xD;
*还可以鼠标中键(滚轮)关闭标签页，前提是middlemouse.contentLoadURL 值改"false" （默认）&lt;/p&gt;&#xD;
&lt;p&gt;问题：如何卸载、重装扩展&lt;/p&gt;&#xD;
有的时候用ff卸载扩展时，&amp;ldquo;工具&amp;rdquo;－&amp;gt;&amp;ldquo;扩展&amp;rdquo;中老是出现该扩展将在重启后卸载字样，重启后依然。解决 方法是：&lt;br /&gt;&#xD;
（1）找到扩展位置&lt;br /&gt;&#xD;
C:\Documents and Settings\用户名&lt;a target="_blank"&gt;\Application&lt;/a&gt; Data\Mozilla\Firefox\Profiles\huktwibl.default\extensions&lt;br /&gt;&#xD;
或 者C:\Documents and Settings\Administrator\Application  Data\Mozilla\Firefox\Profiles\imtf0pke.default\extensions&lt;br /&gt;&#xD;
（2）删掉extensions中所有内容，除 Extensions.rdf外&lt;br /&gt;&#xD;
（3）重启ff，进入&amp;ldquo;工具&amp;rdquo;－&amp;gt;&amp;ldquo;扩展&amp;rdquo;，不管它，再卸载一次&lt;br /&gt;&#xD;
（4）退出重启后就好 了，可以挑选自己需要的扩展安装&lt;/div&gt;&lt;img src="http://www.cnblogs.com/wuhen/aggbug/2046856.html?type=2" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wuhen/articles/2046856.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
