﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-知易行难，贵在坚持</title><link>http://www.blogjava.net/chaobingj/</link><description>l love open coding ,l love my family member for ever</description><language>zh-cn</language><lastBuildDate>Mon, 13 Apr 2026 08:56:53 GMT</lastBuildDate><pubDate>Mon, 13 Apr 2026 08:56:53 GMT</pubDate><ttl>60</ttl><item><title>采用p6spy完整显示hibernate的SQL语句</title><link>http://www.blogjava.net/chaobingj/archive/2006/08/21/64710.html</link><dc:creator>尚沃</dc:creator><author>尚沃</author><pubDate>Mon, 21 Aug 2006 01:37:00 GMT</pubDate><guid>http://www.blogjava.net/chaobingj/archive/2006/08/21/64710.html</guid><wfw:comment>http://www.blogjava.net/chaobingj/comments/64710.html</wfw:comment><comments>http://www.blogjava.net/chaobingj/archive/2006/08/21/64710.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chaobingj/comments/commentRss/64710.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chaobingj/services/trackbacks/64710.html</trackback:ping><description><![CDATA[虽然在hibernate中有show_sql选项，但是显示出来的语句大多类似<br />    select * from xxx where value=?<br />    但是有时候我们需要得到完整的SQL语句，怎么办呢？使用P6SPY就可以完成这个任务
<p>    p6spy是一个开源软件，它可以跟踪任何使用jdbc的应用产生的数据库操作。特别适合于监控ejb服务器产生的 sql statements。<br />    官方网址：<a href="http://www.p6spy.com/"><font color="#1a8bc8">http://www.p6spy.com/</font></a><br />    目前p6spy 适用的应用服务器包括jboss, atg, orion, jonas, iplanet, weblogic, websphere, resin and tomcat.</p><p>下面我介绍一下p6spy在tomcat应用程序上安装的步骤：<br />（1）<a href="http://www.p6spy.com/download.html"><font color="#1a8bc8">http://www.p6spy.com/download.html</font></a>，下载zip包<br />（2）解压出p6spy.jar spy.properties两个文件<br />（3）将p6spy.jar 放入应用程序的WEB-INF/lib目录，将spy.properties放入WEB-INF/classes目录<br />（4）修改spy.properties</p><p>    realdriver  =com.mysql.jdbc.Driver  将这行前面的#去掉<br />    logfile     = c:/spy.log  修改一个你需要的日志文件名<br />    <br />（5）修改hibernate.xml，修改connection.driver_class的值为com.p6spy.engine.spy.P6SpyDriver<br />（6）重启tomcat<br />（7）这样在c:/下的spy.log记录了数据库的访问情况。<br /><br />相关链接 ：<a href="/qclass/archive/2006/08/21/64692.html">http://www.blogjava.net/qclass/archive/2006/08/21/64692.html</a></p><img src ="http://www.blogjava.net/chaobingj/aggbug/64710.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chaobingj/" target="_blank">尚沃</a> 2006-08-21 09:37 <a href="http://www.blogjava.net/chaobingj/archive/2006/08/21/64710.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>项目管理的资料</title><link>http://www.blogjava.net/chaobingj/archive/2006/08/21/64707.html</link><dc:creator>尚沃</dc:creator><author>尚沃</author><pubDate>Mon, 21 Aug 2006 01:25:00 GMT</pubDate><guid>http://www.blogjava.net/chaobingj/archive/2006/08/21/64707.html</guid><wfw:comment>http://www.blogjava.net/chaobingj/comments/64707.html</wfw:comment><comments>http://www.blogjava.net/chaobingj/archive/2006/08/21/64707.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chaobingj/comments/commentRss/64707.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chaobingj/services/trackbacks/64707.html</trackback:ping><description><![CDATA[最近的一个工作任务就是建立公司的开发团队，看了很多这方面的资料，也思考了很多，希望大家能够提出自己的见解，共同学习共同提高。<br />一、关于队员选择<br />根据我自己的价值观我觉得选择队员应该考虑下面几个因素：<br />1、价值观。我觉得具有相同价值观或者对很多事情有一致看法的人，交流和相处起来比较融洽，甚至对工作、待遇、事业有相同观点。<br />2、工作态度。这包括工作主动性、积极性、激情、团队精神等方面。<br />3、工作能力。当然不一定要求队员的工作能力有多高，但是至少得具有基本的一些能力，如果对将要面对的工作丝毫不了解的话，学习起来的剃度是非常大的，对企业、对团队来说，风险都是非常大的。<br />4、学习能力。无论现在的能力是否出色，但是必须保持一个持续的、超强的学习能力，总是吃老本，迟早要被淘汰。<br />综合上面的几点，相信大家可以看出，我看重的应该是人，而不是这个人目前具有怎样的能力。我在和应聘者谈话的时候，根本不会去问一些非常具体的问题，例如：Map和Set有什么区别之类的问题，我觉得这不是问题的关键，我需要的是一个合作伙伴，不是一个只为了工作而工作的队员。<br />此外，我还希望团队中的每一位队友都具有责任心、事业心、热心、虚心的个人魅力。<br />二、关于团队发展<br />我的目标是希望能够组建一个稳定的、技术互补的、学习能力强的、具有核心竞争力的团队。当然，组建一个优秀的团队是需要很长时间的，并经历很多过程才来成长起来的。团队的发展离不开个人的发展，我的想法将队员分配在不同的岗位上，这其中必然有大家都不想做的工作岗位，但是并不代表这些岗位不重要或者没有发展前途。这个时候，就是体现一个队员价值观的时候了，从我角度讲，我觉得测试人员、界面开发人员和开发人员是同等重要的，甚至在资源不足的情况下，一个优秀的测试人员和界面开发人员要比一个优秀的开发人员重要的多。所以我觉得，对一个优秀的测试人员和界面开发人员，他们的薪酬和受重视度应该是和开发人员同等的。<br />只有合理的将人力资源分配在项目涉及到的不同岗位上，并且每个队员在自己的岗位上都能努力的工作并在该领域积累丰富的经验，甚至成为该领域的专家，这无论对企业、对团队还是对个人，都是最成功的。相反，如果大家都根据自己的观点学习某一个或某些领域的话，一种情况是，在某个岗位产生资源浪费，而在大家都不看好的岗位出现资源不足，另一种情况就是大家对很多领域都有涉及，但是在哪个领域都不精通，很难成为某个领域的专家。这样一种模式下，是很难实现技术互补并具有核心竞争力的优秀的团队。<br />三、关于价值体现<br />由于队员从事的岗位不同，价值的体现形式就不同，所以需要一种合理的、公平的、公正的奖励机制，这样才能保证团队的良性发展并保持团队的凝聚力。当然，沟通的重要性就不言而喻了，它存在于各个环节的方方面面。<br />在我们拥有了一支非常优秀的团队后，我想，我们离成功已经不远了。这个时候，团队的稳定性受到了严重的考验，为什么呢？因为这个时候一般的薪酬、奖励已经显得不是非常重要了，随着团队的快速发展，应该让队员们看到自己所能拥有的更大价值，例如给队员提供一定的期权或者股份等，让大家明白并且相信，企业利益最大化的同时也就意味着个人利益的最大化。世界上最伟大的管理原则就是“人们总是会去做受到奖励的事情”。<br />四、关于人才贮备<br />无论团队具有怎样的稳定性，人才的流动是无法避免的，所以就要求我们的团队一定要做好人才的贮备工作，这样可以在规避很多风险的同时，也是成本最低的一种方式。<br /><br />相关的链接地址：   <a href="/coldtear/">http://www.blogjava.net/coldtear/</a><img src ="http://www.blogjava.net/chaobingj/aggbug/64707.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chaobingj/" target="_blank">尚沃</a> 2006-08-21 09:25 <a href="http://www.blogjava.net/chaobingj/archive/2006/08/21/64707.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式介绍及其在EmEditor的应用(更新) </title><link>http://www.blogjava.net/chaobingj/archive/2006/03/17/35830.html</link><dc:creator>尚沃</dc:creator><author>尚沃</author><pubDate>Fri, 17 Mar 2006 06:43:00 GMT</pubDate><guid>http://www.blogjava.net/chaobingj/archive/2006/03/17/35830.html</guid><wfw:comment>http://www.blogjava.net/chaobingj/comments/35830.html</wfw:comment><comments>http://www.blogjava.net/chaobingj/archive/2006/03/17/35830.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chaobingj/comments/commentRss/35830.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chaobingj/services/trackbacks/35830.html</trackback:ping><description><![CDATA[正则表达式, 英文 Regular expression, 简写Regexes或Regex. <br /><br /><b>应用概述</b>: 提供与预期的搜索结果匹配的确切文本来进行字符串的搜索和替换操作, 这种技术不仅仅用于开发领域, 更被集成到一些常见的文本扩展编辑器, 如UltraEdit, Emeditor等. 历史上第一个实用应用程序是Unix 中的qed 编辑器。<br /><br />举一个简单的类比: 我们对DOS中的通配符"*"和"?"应该很熟悉, 如命令"dir *.exe" 将列出所有后缀名为exe的文件名. 正则表达式提供的方法与其类似, 而且远比通配符强大的多.<br /><br />从某种意义上说, 正则表达式是一种语言, 通过及其简短的一行代码即可以高效, 精确的描述要匹配的复杂文本, 当然, 它最大的优点也是他最大的缺点: 语法复杂, 创建困难. (熟悉之后就可以忽略后半句了 :p)<br /><br /><b>主要应用</b>: 
<ul><li><u>数据验证</u>; 这是正则表达式在开发中最常见的应用, 通过测试字符串内的模式。来验证输入的字符串是否为邮政编码, 电话号码, 电子邮件地址, 信用卡号码等等。 
</li><li><u>搜索和替换文本</u>; 用正则表达式来搜索文档中的特定文本块, 根据需要用其他指定的文本块进行替换。这也是文本编辑中的一个常见应用, 如将网页中的HTML代码转化为UBB代码.</li></ul><br />既然发在『软件使用』板, 正则表达式的开发中的应用就不介绍了, 以下仅以EmEditor中的正则表达式来作介绍:<br /><br /><u>1. 启用正则表达式</u><br /><br />菜单: Search - Find (Replace) - 选中 Use Regular Expressions<br /><br /><u>2. Emeditor 正则语法</u><br /><br />正则表达式是普通字符和元字符组合的一种模式. 它的结构与算术表达式的结构类似, 各种元字符和运算符可以将小的表达式组合起来，创建大的表达式。通过在一对分隔符之间放置表达式模式的各种组件，就可以构建正则表达式。<br /><br /><i>2.1 普通字符</i><blockquote>普通字符是指除了 ".", "*", "?", "+", "(", ")", "{", "}", "[", "]", "^", "$" 和 "\" 这些特殊字符之外的所有其他字符. 而这些特殊字符也可以通过前面加上"\"前缀而变为普通字符. 比如, 搜索"CCF"即为在文本中匹配所有的"CCF"字符串, 搜索"\[CCF\]"则是在文本中匹配所有的"[CCF]"字符串.<br />简而言之, 普通字符即为只匹配自身的字符.</blockquote><br /><i>2.2 元字符</i><blockquote>元字符不匹配其自身，它用特殊方式来解析从而实现更多的逻辑功能。正则表达式通过元字符在模式中包含选择和循环</blockquote><br /><u><i>2.2.1 特殊字符</i></u><br /><ul><li><font color="blue">.</font> 匹配除换行符 \n 之外的任何单个字符。 
</li><li><font color="blue">( )</font> 分组捕获(子表达式)的开始和结束。可以捕获子表达式以供以后使用。 
</li><li><font color="blue">[ ]</font> 中括号表达式的开始。 
<blockquote>中括号表达式是在方括号内包含一个或多个字符构成的列表的表达式。普通字符在中括号内表示本身，大多数特殊字符在中括号表达式内出现时失去它们的意义。除了转义字符'\', (要包含'\', 需要使用'\\') 如: 正则表达式 No [1234] 匹配 No 1, No 2, No 3 和 No 4.<br /><br />如果想在中括号中使用一个范围作为列表来匹配字符，可以用连字符 '-' 将范围中的开始字符和结束字符分开。单个字符的字符值确定范围内的相对顺序。如: 正则表达式 No [1-4] = No [1234]<br />注意 1. 开始值的Unicode值必须在结束值Unicode值的前面。<br />注意 2. [\-]匹配连字符'-', 放在中括号列表的开始或结尾也可起到同样的效果, 如 [-c-f] 匹配 c 至 f 的字符和连字符<br /><br />如果需要匹配不属于列表或范围内的任何字符，可以在列表开头加上'^'前缀。如: 正则表达式 No [^1-4] 匹配 No 5 和更大的编号.<br /><br />中括号表达式还可进行组合, 如 [A-Za-z0-9] 匹配A-Z, a-z, 0-9 的字符<br /></blockquote></li><li><font color="blue">\ </font>将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如， 
<blockquote>字符 n 匹配字符 n<br />\n 匹配换行符<br />序列 \\ 匹配 \<br />序列 \( 匹配 ( </blockquote></li><li><font color="blue">| </font>替换字符, 对|左右的两个项分别匹配进行选择。或者说, 就是逻辑的OR的概念 
</li><li><font color="blue">{ }</font> 标记限定符表达式的开始。 
<blockquote>(数量)限定字符<br />限定字符能够指定正则表达式的某个部分必须出现的次数 
<ul><li><font color="green">*</font> 零次或多次匹配前面的字符或子表达式。如，c*f 可以匹配 f 和 ccf。* = {0,} 
</li><li><font color="green">+</font> 一次或多次匹配前面的字符或子表达式。如，c+f 可以匹配 cf 和 ccf，但不匹配 f。+ = {1,} 
</li><li><font color="green">?</font> 零次或一次匹配前面的字符或子表达式。如，cc?f 可以匹配 cf 或 ccf。? = {0,1} 
</li><li><font color="green">{n}</font> n 是非负整数。正好匹配 n 次。如，c{2}f 可以匹配 ccf。 
</li><li><font color="green">{n,}</font> n 是非负整数。至少匹配 n 次。如，c{2,}f 不匹配 cf，而可以匹配 ccccccf。c{1,} = c+。c{0,} = c* 
</li><li><font color="green">{n,m}</font> m 和 n 是非负整数，其中 n &lt;= m。至少匹配 n 次，至多匹配 m 次。如，c{1,3} 可以匹配 ccf 中的cc。c{0,1} 等效于 c?。</li></ul></blockquote></li></ul><br /><u><i>2.2.2 控制字符</i></u><blockquote><ul><li><font color="blue">\a</font> Bell 字符。= 0x07 
</li><li><font color="blue">\f</font> 换页符匹配。= 0x0C 
</li><li><font color="blue">\n</font> 换行符匹配。= 0x0A 
</li><li><font color="blue">\r</font> 匹配一个回车符。= 0x0D 
</li><li><font color="blue">\t</font> 制表符匹配。= 0x09 
</li><li><font color="blue">\v</font> 垂直制表符匹配。= 0x0B 
</li><li><font color="blue">\e</font> ASCII 换码字符。= 0x1B 
</li><li><font color="blue">\0dd</font> 八进制换码字符, dd代表八进制数字。 
</li><li><font color="blue">\xXXXX或\x{XXXX}</font> 4位十六进制Unicode字符, XXXX代表十六进制数字。 
</li><li><font color="blue">\cZ Z-'@'</font> 控制字符Control-Z, Z为大于等与"@"的ASCII字符</li></ul></blockquote><br /><i><u>2.2.3 换码字符</u></i><blockquote><ul><li><font color="blue">\w</font> 任一单词字符, 如A-Z, a-z, 0-9, _等, 如 \w\w\w可以匹配 U_4 但不匹配 %^e 
</li><li><font color="blue">\W</font> 任一非单词字符, 如 \W\W 可以匹配 *&amp; 但不匹配 7# 
</li><li><font color="blue">\s</font> 任一空白字符，包括空格、制表符、换页符、回车符和垂直制表符。= [ \f\n\r\t\v] 
</li><li><font color="blue">\S</font> 任一非空白字符. = [^ \f\n\r\t\v] 
</li><li><font color="blue">\d</font> 0-9的任一数字字符, 如 \d\d可以匹配 54 但不匹配 a4 
</li><li><font color="blue">\D</font> 任一非数字字符. 如 \D\D可以匹配 a4 但不匹配 54 
</li><li><font color="blue">\l</font> a-z 之间的任一小写字符, 如 \l\l\l可以匹配 ccf 但不匹配 ccF 
</li><li><font color="blue">\L</font> 任一非小写字符, 如 \L\L\L可以匹配 CCF 但不匹配 cCF 
</li><li><font color="blue">\u</font> a-z 之间的任一大写字符, 如 \u\u\u可以匹配 CCF 但不匹配 CCf 
</li><li><font color="blue">\U</font> 任一非大写字符, 如 \U\U\U可以匹配 ccf 但不匹配 ccF 
</li><li><font color="blue">\C</font> 任一字符, = '.' 
</li><li><font color="blue">\Q</font> 前置引号符, 其后的任意字符均被认为普通字符直至出现后置引号符\E. 同时匹配单引号和双引号 
</li><li><font color="blue">\E</font> 后置引号符</li></ul></blockquote><br /><u><i>2.2.4 转义字符串</i></u><br /><br />表示为[:classname:], 如"[[:space:]]"表示所有的空格字符<br /><blockquote><ul><li><font color="blue">alnum</font> 任一单词字符和数字字符. = [\w\d] 
</li><li><font color="blue">alpha</font> 任何一个单词字符, 如A-Z, a-z, 0-9 
</li><li><font color="blue">blank</font> 任一空白字符，包括空格、制表符、换页符、回车符和垂直制表符。= [ \f\n\r\t\v] = \s 
</li><li><font color="blue">cntrl</font> 任一控制字符. 
</li><li><font color="blue">digit</font> 0-9的任一数字字符, = \d 
</li><li><font color="blue">graph</font> 任一图形字符. 
</li><li><font color="blue">lower</font> a-z 之间的任一小写字符 =\l 
</li><li><font color="blue">print</font> 任一可打印字符 = '.' = \C 
</li><li><font color="blue">punct</font> 任一标点符号 
</li><li><font color="blue">space</font> 任一空格字符 
</li><li><font color="blue">upper</font> a-z 之间的任一大写字符 = \u 
</li><li><font color="blue">xdigit</font> 4位十六进制Unicode字符, = \xXXXX 
</li><li><font color="blue">word</font> 任何一个单词字符, 如A-Z, a-z, 0-9, _等, = \w 
</li><li><font color="blue">unicode</font> 任何一个ASCII值大于255的字符</li></ul></blockquote><br /><u><i>2.2.5 定位字符</i></u><br /><br />定位字符可以把正则表达式固定到行首或行尾。在Perl正则全集中还能使正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾, emeditor只是一个子集, 不包含这个功能。 
<blockquote><ul><li><font color="blue">^</font> 匹配输入字符串开始的位置。如果设置customize中的"regular expressions can match new line characters"，那么 ^ 还匹配 \n 或 \r 后面的位置。 但在中括号表达式中使用的情况除外，在那种情况下它对字符集求反。 
</li><li><font color="blue">$</font> 匹配输入字符串结尾的位置。如果设置customize中的"regular expressions can match new line characters"，那么 $ 还匹配 \n 或 \r 前面的位置。</li></ul></blockquote><br /><u>3. 分组捕获和替换</u><br /><br />分组通常用来捕获特定模式的一组文本, 并用与之后的替换操作, 这也就是将分组和替换结合起来讲解的原因. <br />最基本的分组构造方式就是(),在左右括号中括起来的部分，就是一个分组；在正则全集中还有如(?&lt;name&gt; )的命名分组方式，这种方式组合了模式在就是对分组的部分进行了命名，这样就可以通过该组的命名来获取信息, 但这种方式在emeditor中不被支持. 以下分别来介绍各种不同的分组:<br /><blockquote><ul><li><font color="blue">()</font><b>组捕获</b>. 这种分组对模式在括号内所捕获的字符进行组合, 并且每个分组捕获的匹配结果都将保存为一个实体以备其后的操作所引用. 甚至在正则全集中还可对前面的分组进行反向引用(这是题外话, emeditor不支持). 举例说明:<br />源文本: 
<div style="MARGIN: 5px 20px 20px"><div class="smallfont" style="MARGIN-BOTTOM: 2px">代码:</div><pre class="alt2" style="BORDER-RIGHT: 1px inset; PADDING-RIGHT: 5px; BORDER-TOP: 1px inset; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: 1px inset; WIDTH: 640px; PADDING-TOP: 5px; BORDER-BOTTOM: 1px inset; HEIGHT: 34px">site status- online members: 65, online guests: 12</pre></div>使用正则表达式: 
<div style="MARGIN: 5px 20px 20px"><div class="smallfont" style="MARGIN-BOTTOM: 2px">代码:</div><pre class="alt2" style="BORDER-RIGHT: 1px inset; PADDING-RIGHT: 5px; BORDER-TOP: 1px inset; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: 1px inset; WIDTH: 640px; PADDING-TOP: 5px; BORDER-BOTTOM: 1px inset; HEIGHT: 34px">(members|guests): \d+</pre></div>括号中有两个可能的匹配: members 和 guests, 只需要匹配其中任意一个; 其后是冒号和一个空格, 最后匹配至少一个数字. 匹配模式结果如下: 
<div style="MARGIN: 5px 20px 20px"><div class="smallfont" style="MARGIN-BOTTOM: 2px">代码:</div><pre class="alt2" style="BORDER-RIGHT: 1px inset; PADDING-RIGHT: 5px; BORDER-TOP: 1px inset; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: 1px inset; WIDTH: 640px; PADDING-TOP: 5px; BORDER-BOTTOM: 1px inset; HEIGHT: 50px">members: 65
guests: 12</pre></div>其中members和guests在两次匹配中被捕捉, 可以在随后的操作中引用.<br /></li><li><font color="blue">(?:)</font><b>非组捕获</b>. 这种分组仅仅对模式在括号内所匹配的字符进行组合, 模式所匹配的字符将不会作为一个组来捕获. 虽然他也同样成为最终的匹配结果的一部分, 但无法为其后的操作所引用. 同样以上例继续:<br />使用正则表达式: 
<div style="MARGIN: 5px 20px 20px"><div class="smallfont" style="MARGIN-BOTTOM: 2px">代码:</div><pre class="alt2" style="BORDER-RIGHT: 1px inset; PADDING-RIGHT: 5px; BORDER-TOP: 1px inset; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: 1px inset; WIDTH: 640px; PADDING-TOP: 5px; BORDER-BOTTOM: 1px inset; HEIGHT: 34px">(?:members|guests): \d+</pre></div>匹配模式结果同样为: 
<div style="MARGIN: 5px 20px 20px"><div class="smallfont" style="MARGIN-BOTTOM: 2px">代码:</div><pre class="alt2" style="BORDER-RIGHT: 1px inset; PADDING-RIGHT: 5px; BORDER-TOP: 1px inset; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: 1px inset; WIDTH: 640px; PADDING-TOP: 5px; BORDER-BOTTOM: 1px inset; HEIGHT: 50px">members: 65
guests: 12</pre></div>但是members和guests仅仅在两次匹配中被分组, 并不被捕获, 也不可以在随后的操作中引用.<br />使用非捕获组有其原因和场合. 其一, 从效率上说, 捕获一个分组需要消耗额外的资源和处理时间, 所以不应该捕获不需要使用的数据. 其二, 对模式中有多个捕获组的情况, 对不需要处理的分组进行捕获只会对分组信息造成混乱. 其三, 避免不需要贪婪匹配的场合发生贪婪匹配, 贪婪匹配是正则引擎的一个重要特性, 要说清楚其机理可能还需要另外开一个专题了. 对这一点, 还以上例说明一下:<br />使用不带分组的正则表达式: 
<div style="MARGIN: 5px 20px 20px"><div class="smallfont" style="MARGIN-BOTTOM: 2px">代码:</div><pre class="alt2" style="BORDER-RIGHT: 1px inset; PADDING-RIGHT: 5px; BORDER-TOP: 1px inset; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: 1px inset; WIDTH: 640px; PADDING-TOP: 5px; BORDER-BOTTOM: 1px inset; HEIGHT: 34px">members|guests: \d+</pre></div>匹配模式为: 
<div style="MARGIN: 5px 20px 20px"><div class="smallfont" style="MARGIN-BOTTOM: 2px">代码:</div><pre class="alt2" style="BORDER-RIGHT: 1px inset; PADDING-RIGHT: 5px; BORDER-TOP: 1px inset; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: 1px inset; WIDTH: 640px; PADDING-TOP: 5px; BORDER-BOTTOM: 1px inset; HEIGHT: 50px">members
guests: 12</pre></div>这个正则表达式的问题在于, 他匹配的是"members" 或 "guests: \d+", 这是模式中贪婪"消费"字符引起的. 而通过增加括号进行分组, 使正则引擎将两个匹配选项作为一个组处理, 从而正确匹配其中的一个匹配项.<br /></li><li><font color="blue">(?=)</font><b>正声明组, 非捕获</b>. 此分组中的模式必须出现在声明的右侧, 并且, 这个模式不构成匹配结果的一部分. 举例:<br />源文本: 
<div style="MARGIN: 5px 20px 20px"><div class="smallfont" style="MARGIN-BOTTOM: 2px">代码:</div><pre class="alt2" style="BORDER-RIGHT: 1px inset; PADDING-RIGHT: 5px; BORDER-TOP: 1px inset; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: 1px inset; WIDTH: 640px; PADDING-TOP: 5px; BORDER-BOTTOM: 1px inset; HEIGHT: 34px">site status- online members: 65, online guests: 12</pre></div>使用正则表达式: 
<div style="MARGIN: 5px 20px 20px"><div class="smallfont" style="MARGIN-BOTTOM: 2px">代码:</div><pre class="alt2" style="BORDER-RIGHT: 1px inset; PADDING-RIGHT: 5px; BORDER-TOP: 1px inset; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: 1px inset; WIDTH: 640px; PADDING-TOP: 5px; BORDER-BOTTOM: 1px inset; HEIGHT: 34px">\S+(?=\s\d+)</pre></div>此模式中规定了\s\d+必须出现在\S+声明的右侧. 也就是说, 在至少一个非空格字符(声明)的右侧必须出现一个空格字符和至少一个数字, 而且只有这个声明构成匹配结果. 匹配模式结果如下: 
<div style="MARGIN: 5px 20px 20px"><div class="smallfont" style="MARGIN-BOTTOM: 2px">代码:</div><pre class="alt2" style="BORDER-RIGHT: 1px inset; PADDING-RIGHT: 5px; BORDER-TOP: 1px inset; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: 1px inset; WIDTH: 640px; PADDING-TOP: 5px; BORDER-BOTTOM: 1px inset; HEIGHT: 50px">members:
guests:</pre></div>这两次匹配中不被捕捉.<br /></li><li><font color="blue">(?!)</font><b>负声明组, 非捕获</b>. 此分组中的模式不得出现在声明的右侧, 并且, 这个模式不构成匹配结果的一部分. 还是用上面的例子:<br />使用正则表达式: 
<div style="MARGIN: 5px 20px 20px"><div class="smallfont" style="MARGIN-BOTTOM: 2px">代码:</div><pre class="alt2" style="BORDER-RIGHT: 1px inset; PADDING-RIGHT: 5px; BORDER-TOP: 1px inset; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: 1px inset; WIDTH: 640px; PADDING-TOP: 5px; BORDER-BOTTOM: 1px inset; HEIGHT: 34px">\d{2}(?!,)</pre></div>此模式中规定了","不得出现在\d{2}声明的右侧. 也就是说, 在连续两个数字(声明)的右侧不得出现逗号才能被匹配. 匹配模式结果如下: 
<div style="MARGIN: 5px 20px 20px"><div class="smallfont" style="MARGIN-BOTTOM: 2px">代码:</div><pre class="alt2" style="BORDER-RIGHT: 1px inset; PADDING-RIGHT: 5px; BORDER-TOP: 1px inset; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: 1px inset; WIDTH: 640px; PADDING-TOP: 5px; BORDER-BOTTOM: 1px inset; HEIGHT: 34px">12</pre></div>这两次匹配中不被捕捉.</li></ul></blockquote><br />严格的说, 后面两个分组不能称之为分组, 他们只是模式声明, 他们不能成为匹配结果, 也不能被捕获. 在正则全集中, 还有反向声明分组(?&lt;=)(?&lt;!)和非回溯分组(?&gt;), 在emeditor中不被支持.<br /><br />说到括号的功能, 本来正则中的一个重要指令-条件指令和分组内联设定是不得不说的, 可惜的是... emeditor也同样不支持~~~~<br /><br />在前面的例子中一直提到匹配之后的操作, 而这个进一步的操作最常见的就是替换. 先继续上面的例子:<br />源文本: 
<div style="MARGIN: 5px 20px 20px"><div class="smallfont" style="MARGIN-BOTTOM: 2px">代码:</div><pre class="alt2" style="BORDER-RIGHT: 1px inset; PADDING-RIGHT: 5px; BORDER-TOP: 1px inset; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: 1px inset; WIDTH: 640px; PADDING-TOP: 5px; BORDER-BOTTOM: 1px inset; HEIGHT: 34px">site status- online members: 65, online guests: 12</pre></div>使用搜索正则表达式: 
<div style="MARGIN: 5px 20px 20px"><div class="smallfont" style="MARGIN-BOTTOM: 2px">代码:</div><pre class="alt2" style="BORDER-RIGHT: 1px inset; PADDING-RIGHT: 5px; BORDER-TOP: 1px inset; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: 1px inset; WIDTH: 640px; PADDING-TOP: 5px; BORDER-BOTTOM: 1px inset; HEIGHT: 34px">(members|guests)</pre></div>和替换正则表达式: 
<div style="MARGIN: 5px 20px 20px"><div class="smallfont" style="MARGIN-BOTTOM: 2px">代码:</div><pre class="alt2" style="BORDER-RIGHT: 1px inset; PADDING-RIGHT: 5px; BORDER-TOP: 1px inset; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: 1px inset; WIDTH: 640px; PADDING-TOP: 5px; BORDER-BOTTOM: 1px inset; HEIGHT: 34px">ccf-\1</pre></div>匹配模式结果如下: 
<div style="MARGIN: 5px 20px 20px"><div class="smallfont" style="MARGIN-BOTTOM: 2px">代码:</div><pre class="alt2" style="BORDER-RIGHT: 1px inset; PADDING-RIGHT: 5px; BORDER-TOP: 1px inset; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: 1px inset; WIDTH: 640px; PADDING-TOP: 5px; BORDER-BOTTOM: 1px inset; HEIGHT: 50px">members
guests</pre></div>替换后的文本为: 
<div style="MARGIN: 5px 20px 20px"><div class="smallfont" style="MARGIN-BOTTOM: 2px">代码:</div><pre class="alt2" style="BORDER-RIGHT: 1px inset; PADDING-RIGHT: 5px; BORDER-TOP: 1px inset; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: 1px inset; WIDTH: 640px; PADDING-TOP: 5px; BORDER-BOTTOM: 1px inset; HEIGHT: 34px">site status- online ccf-members: 65, online ccf-guests: 12</pre></div>其中members和guests在两次匹配中被捕捉, 在随后被引用, 并添加ccf-前缀后替换源文本中的匹配字符.<br />在匹配模式中的分组匹配结果将按前后顺序被正则引擎分别赋予内部组号, 在替换操作中就可以用\加上这个组号来引用相应的匹配结果. 继续上例:<br />使用搜索正则表达式: 
<div style="MARGIN: 5px 20px 20px"><div class="smallfont" style="MARGIN-BOTTOM: 2px">代码:</div><pre class="alt2" style="BORDER-RIGHT: 1px inset; PADDING-RIGHT: 5px; BORDER-TOP: 1px inset; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: 1px inset; WIDTH: 640px; PADDING-TOP: 5px; BORDER-BOTTOM: 1px inset; HEIGHT: 34px">(members|guests): (\d{2})</pre></div>和替换正则表达式: 
<div style="MARGIN: 5px 20px 20px"><div class="smallfont" style="MARGIN-BOTTOM: 2px">代码:</div><pre class="alt2" style="BORDER-RIGHT: 1px inset; PADDING-RIGHT: 5px; BORDER-TOP: 1px inset; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: 1px inset; WIDTH: 640px; PADDING-TOP: 5px; BORDER-BOTTOM: 1px inset; HEIGHT: 34px">ccf-\1 = \2</pre></div>匹配模式结果如下: 
<div style="MARGIN: 5px 20px 20px"><div class="smallfont" style="MARGIN-BOTTOM: 2px">代码:</div><pre class="alt2" style="BORDER-RIGHT: 1px inset; PADDING-RIGHT: 5px; BORDER-TOP: 1px inset; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: 1px inset; WIDTH: 640px; PADDING-TOP: 5px; BORDER-BOTTOM: 1px inset; HEIGHT: 50px">members: 65
guests: 12</pre></div>替换后的文本为: 
<div style="MARGIN: 5px 20px 20px"><div class="smallfont" style="MARGIN-BOTTOM: 2px">代码:</div><pre class="alt2" style="BORDER-RIGHT: 1px inset; PADDING-RIGHT: 5px; BORDER-TOP: 1px inset; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: 1px inset; WIDTH: 640px; PADDING-TOP: 5px; BORDER-BOTTOM: 1px inset; HEIGHT: 34px">site status- online ccf-members = 65, online ccf-guests = 12</pre></div><br />在emeditor的正则子集中增加了一个特殊的引用: \0 , \0 将引用上次的匹配结果, 继续把:<br />使用搜索正则表达式: 
<div style="MARGIN: 5px 20px 20px"><div class="smallfont" style="MARGIN-BOTTOM: 2px">代码:</div><pre class="alt2" style="BORDER-RIGHT: 1px inset; PADDING-RIGHT: 5px; BORDER-TOP: 1px inset; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: 1px inset; WIDTH: 640px; PADDING-TOP: 5px; BORDER-BOTTOM: 1px inset; HEIGHT: 34px">\d{2}</pre></div>和替换正则表达式: 
<div style="MARGIN: 5px 20px 20px"><div class="smallfont" style="MARGIN-BOTTOM: 2px">代码:</div><pre class="alt2" style="BORDER-RIGHT: 1px inset; PADDING-RIGHT: 5px; BORDER-TOP: 1px inset; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: 1px inset; WIDTH: 640px; PADDING-TOP: 5px; BORDER-BOTTOM: 1px inset; HEIGHT: 34px">*\0*</pre></div>匹配模式结果如下: 
<div style="MARGIN: 5px 20px 20px"><div class="smallfont" style="MARGIN-BOTTOM: 2px">代码:</div><pre class="alt2" style="BORDER-RIGHT: 1px inset; PADDING-RIGHT: 5px; BORDER-TOP: 1px inset; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: 1px inset; WIDTH: 640px; PADDING-TOP: 5px; BORDER-BOTTOM: 1px inset; HEIGHT: 50px">65
12</pre></div>替换后的文本为: 
<div style="MARGIN: 5px 20px 20px"><div class="smallfont" style="MARGIN-BOTTOM: 2px">代码:</div><pre class="alt2" style="BORDER-RIGHT: 1px inset; PADDING-RIGHT: 5px; BORDER-TOP: 1px inset; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: 1px inset; WIDTH: 640px; PADDING-TOP: 5px; BORDER-BOTTOM: 1px inset; HEIGHT: 34px">site status- online ccf-members: *65*, online ccf-guests: *12*</pre></div><br />作为一个编辑软件, emeditor的正则子集中增加了一些替换修饰符:<br /><blockquote><ul><li><font color="blue">\U</font> 大写修饰. 将其后的所有的字符替换为大写 
</li><li><font color="blue">\L</font> 小写修饰. 将其后的所有的字符替换为小写 
</li><li><font color="blue">\H</font> 半角修饰. 将其后的所有的字符替换为半角字符. 写到这里, 不得不称许一下emeditor对中文的良好支持, 这个\H至少我是很常用的, 不喜欢看到文本里面都是些１２３ａｂｃ之类的全角字符... 
</li><li><font color="blue">\F</font> 全角修饰. 将其后的所有的字符替换为全角字符 
</li><li><font color="blue">\E</font> 关闭之前的\U, \L, \H, \F修饰.</li></ul></blockquote><img src ="http://www.blogjava.net/chaobingj/aggbug/35830.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chaobingj/" target="_blank">尚沃</a> 2006-03-17 14:43 <a href="http://www.blogjava.net/chaobingj/archive/2006/03/17/35830.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>study</title><link>http://www.blogjava.net/chaobingj/archive/2006/03/10/34688.html</link><dc:creator>尚沃</dc:creator><author>尚沃</author><pubDate>Fri, 10 Mar 2006 08:18:00 GMT</pubDate><guid>http://www.blogjava.net/chaobingj/archive/2006/03/10/34688.html</guid><wfw:comment>http://www.blogjava.net/chaobingj/comments/34688.html</wfw:comment><comments>http://www.blogjava.net/chaobingj/archive/2006/03/10/34688.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chaobingj/comments/commentRss/34688.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chaobingj/services/trackbacks/34688.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#deb887">
						<font color="#a9a9a9">
								<font color="#a9a9a9" size="5">
										<font color="#ff0000">知识的</font>
										<font color="#ff0000">积累<br /></font>
								</font>
								<br />
								<font color="#ff0000">java lib</font>:<br /><font color="#000000">1.     <a href="http://www.download.com">www.download.com</a><br /></font><font color="#000000">2.    <font color="#0000ff"></font><a href="http://bbs.et8.net/bbs/forumdisplay.php?f=6"><font color="#0000ff">bbs.et8.net/bbs/forumdisplay.php?f=6</font></a>(程序员之家)<br /></font><font color="#000000">3.</font>     <a href="http://www.jactiongroup.net/reference/html/index.html(spring">www.jactiongroup.net/reference/html/index.html(<font color="#000000">spring</font></a><font color="#000000">中文论坛)</font><br /><font color="#000000">4.</font>     <a href="http://forum.hibernate.org/">forum.hibernate.org/</a><a href="http://www.cn-java.com/index_focus.php?kind=Hibern&amp;title=Hibernate(hibernate中文论坛">(<font color="#000000">hibernate官方论坛</font></a>)<br /><font color="#000000">5.</font>     <a href="http://www.open-open.com/">www.open-open.com/</a>(<font color="#000000">开源的技术网站</font>)<br /><font color="#000000">6.</font>     <br /><font color="#000000">7.</font>     <br /><font color="#ff0000"><font style="BACKGROUND-COLOR: #ffffff"><font color="#ff0000"><br />javascript lib:<br /><font color="#000000">1.</font>     <a href="http://www.blueidea.com">www.blueidea.com</a>(<font color="#000000">蓝色理想</font>)<br /><font color="#000000">2.</font>     <a href="http://www.baron.com.cn/javascript/index5.asp"><font face="宋体">www.baron.com.cn/javascript/index5.asp</font></a><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /></font><br /></font></font><br /><br /><br /></font>
				</font>
		</p>
<img src ="http://www.blogjava.net/chaobingj/aggbug/34688.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chaobingj/" target="_blank">尚沃</a> 2006-03-10 16:18 <a href="http://www.blogjava.net/chaobingj/archive/2006/03/10/34688.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>