??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲熟妇无码久久精品,亚洲精品国产免费,亚洲成aⅴ人片久青草影院按摩 http://www.tkk7.com/kebo/category/6810.html往事随?.....前事如梦...... zh-cnWed, 28 Feb 2007 19:55:10 GMTWed, 28 Feb 2007 19:55:10 GMT60memcached推荐http://www.tkk7.com/kebo/archive/2006/08/11/62888.htmlkebokeboThu, 10 Aug 2006 16:03:00 GMThttp://www.tkk7.com/kebo/archive/2006/08/11/62888.htmlhttp://www.tkk7.com/kebo/comments/62888.htmlhttp://www.tkk7.com/kebo/archive/2006/08/11/62888.html#Feedback1http://www.tkk7.com/kebo/comments/commentRss/62888.htmlhttp://www.tkk7.com/kebo/services/trackbacks/62888.htmlhttp://jehiah.com/projects/memcached-win32/
启动Q用都是比较方ѝ可以到http://www.danga.com/memcached/下各U客户api。下载的client有用test。一看就明白?br />呵呵Q真实好东西?br />
-----------------------

呵呵,发现plone中也用它做缓存了.

--------------------------
前几天用了一下,发现在win下面Ҏ出现占用cpu 100Q的情况,不知道什么原?有谁知道?没有别的什么操作,insert/get操作而已.

查找?......

奇怪,plone中ؓ什么不出现Q!Q!



kebo 2006-08-11 00:03 发表评论
]]>
需?用户)与开发h员对业务的思考模?/title><link>http://www.tkk7.com/kebo/archive/2006/07/01/56075.html</link><dc:creator>kebo</dc:creator><author>kebo</author><pubDate>Sat, 01 Jul 2006 03:58:00 GMT</pubDate><guid>http://www.tkk7.com/kebo/archive/2006/07/01/56075.html</guid><wfw:comment>http://www.tkk7.com/kebo/comments/56075.html</wfw:comment><comments>http://www.tkk7.com/kebo/archive/2006/07/01/56075.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/kebo/comments/commentRss/56075.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/kebo/services/trackbacks/56075.html</trackback:ping><description><![CDATA[在实际的软g开发过E中Q我们常常可以看到这L情ŞQ一斚w是开发h员指责需求h员不懂用L真正的需求,讲解的需求和最后客L要求惛_甚远或指责需求只是客L传声{,拿到的需求不整理一下,׃l开发h员开始做。另一斚w是需求骂开发h员笨Q对需求一点不理解Q只懂机械的做?br />q样的情况,常常Dpȝ不停的修改,bug不断。客P需求,开发都{疲力尽Q然后就是项目g期,直到M?br /><br />       q样的情况,怿每个做企业系l的开发h员都遇到q,一提vq样的问题,大家只有摆脑袋,喃喃到“简直就是恶梦,太难了?br />^_^Q希望不要勾起你痛苦的回忆)<br /><br />     其实出现q样的情况,大部分是应ؓ需求h员和开发h员对问题的思考模式不同导致的。在业务语言和业务规则向计算a和系l模型{换之间有一个的q程。这个过E必L一个衔接的人和模式来做qg事情?br />     q个角色需要精通业务概念和pȝ实现方式。然后运用分析模式方式把业务概念转换为系l模型概c需求h员理解业务L自觉不自觉的把一些他们认为是常识的思维放进去,但是q部分只是不会出现在需求文中。这需要分析h员不断的和他需求聊天,不但的询问挖掘出来。然后写入概要设计和详细涉及文档中?br />q有需求h员往往在写E序需要处理的逻辑的时候会不自觉的融入人类的思考模式,在其中加入一些智能判断,但是q部分逻辑往往用计机实现比较困难。这需要分析h员的z察能力Q找到客L真正需求,然后转换方式来实现?br /><br />      例如Q有q样一个需求是分析业务数据的。表中有27列,其中aQbQcQdQeQgQpQqQyQz为判断过E中所涉及到的数据,各项之间的关pMؓQb列中的传输系l速决定z列中的最大时隙编受如2?Gpȝ对应的最大时隙编号ؓ16?Q保护)?0gpȝ对应的最大时隙编号ؓ64?2Q保护)?br />      D列ؓ与C列中站点盔R的前向站点,e列ؓ与c列中站点盔R的后向站炏V?br />      G列与p列或q列ؓQ-对应关系Q即唯一的一个端口对应当前传输系l的一个时隙?br />      p列和q列在一行中不同时出现。即同时只有前项旉或后Ҏ隙,两者不同时存在?br />      y列ؓ版本P1代表设计版,2代表工程版。当g列中相同的两个端口对应的z列不同的旉Ӟ以Y列ؓ2的ؓ准?br /><br />  <br />Q一下ؓ客户qx所用的人工分析方式Q?br />分析q程Q?br />1Q首先根据系l名UC??G可以判断出Z列的最大编号ؓ16?Q对z列进行观察后得出最大编号ؓ8。即存在8个时隙,~号分别?~8.<br />2)  c列ؓ“杭环城北\”站点下所有z列的数据观察后可看出z列无5Q?两个旉Q于是初步判断时隙在该站点ؓIK?br />3Qc列ؓ“杭环城北\”所对应的D列前向站点ؓ“州网通”。在z列中查找所有c列ؓ“州网通”所对应的时隙,发现5Q?两个旉~号Q且pQq两列中仅q列有数据Q说明该旉为后向时隙。可得出5Q?两个旉的v始站点ؓ“州网通”。因该时隙对应的Y列均?Q?两个数|Ҏ“各w关系”,仅取Y列数gؓ2的数据ؓ有效数据?br />4Qc列ؓ“杭环城北\”所对应的e列后向站点ؓ“宁波网通”。在z列中查找所有c列ؓ“宁波网通”所对应的时隙,发现5Q?两个旉~号。且pQq两列仅p列有数据Q说明该旉为前向时隙,可得?Q?两个旉的终止站点ؓ“宁波网通”。因该时隙对应的Y列均?Q?两个数据Q根据各wq系,取Y列ؓ2的数据ؓ有效数据?br />l合判断1~4不的判断q程Q可以得出结论:~号?Q?的两个时隙以“州网通”ؓLQ途径“杭环城北\”以“宁波网通”ؓl点<br /><br /><br />可以看到q个分析q程很不利于计算<br />Q一下ؓ我的分析方式Q?br /><br /><br /><br />------推荐的方?br /><br /><br /><br />-------其他<br /><br /><br />(未完待箋........)<img src ="http://www.tkk7.com/kebo/aggbug/56075.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/kebo/" target="_blank">kebo</a> 2006-07-01 11:58 <a href="http://www.tkk7.com/kebo/archive/2006/07/01/56075.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Zjboss rule规则引擎的商务折扣例?/title><link>http://www.tkk7.com/kebo/archive/2006/06/13/52307.html</link><dc:creator>kebo</dc:creator><author>kebo</author><pubDate>Mon, 12 Jun 2006 17:19:00 GMT</pubDate><guid>http://www.tkk7.com/kebo/archive/2006/06/13/52307.html</guid><wfw:comment>http://www.tkk7.com/kebo/comments/52307.html</wfw:comment><comments>http://www.tkk7.com/kebo/archive/2006/06/13/52307.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/kebo/comments/commentRss/52307.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/kebo/services/trackbacks/52307.html</trackback:ping><description><![CDATA[<p>xxx购物市折扣规则描述Q?br /> 1.M֮的购物Mh大于1000元则享受9折优?br /> 2.vip֮的时候无物Mh是多n?折优?br /> 3.普通顾客没有特别政{,另有规定的除?br /> 4.白金֮享受8.5优惠Q无物Mh多少?br /> 5.黄金֮享受9折优惠无物Mh多少?br /> 6.M֮所够商品中包含tv的时候,优惠后再优惠9.5?br />q个user case 是自己想的,不是很复?br /><br />对应的规则文?br /><br />#created on: 2006-6-10<br />#created by: kebo<br />package com.sample</p> <p>import com.sample.Person;<br />import com.sample.ShopCat;<br />import com.sample.Product;<br />import com.sample.Helper;</p> <p><br />rule "PRICE_DISCOUT"<br /> salience 2<br /> no-loop true<br /> when<br />  p:Person(c:cat->(c.getTotalPrice()>1000),discout==1)     <br /> then <br />  p.setDiscout(0.9);<br />  modify(p); <br />end</p> <p>rule "VIP"<br /> salience 3<br /> no-loop true<br /> when<br />  p:Person(type==Person.VIP,discout==1)     <br /> then <br />  p.setDiscout(0.7);<br />  modify(p); <br />end</p> <p>rule "COMMON"<br /> salience 3<br /> no-loop true<br /> when<br />  p:Person(type==Person.COMMON,discout==1)     <br /> then <br />  p.setDiscout(1);<br />  modify(p);<br />end</p> <p>rule "PLATINA"<br /> salience 3<br /> no-loop true<br /> when<br />  p:Person(type==Person.PLATINA,discout==1)     <br /> then <br />  p.setDiscout(0.85); <br />  modify(p);<br />end</p> <p>rule "GOLD"<br /> salience 3<br /> no-loop true<br /> when<br />  p:Person(type==Person.GOLD,discout==1)     <br /> then  <br />  p.setDiscout(0.9); <br />  modify(p);<br />end</p> <p>rule "CONTAIN TV"<br /> salience 1<br /> no-loop true<br /> when<br />  p:Person(c:cat->(Helper.isContainType(c.getProducts(),Product.TV)))     <br /> then <br />  p.setDiscout(0.95 * p.getDiscout());<br />  modify(p);<br />end<br /><br />解决rule的冲H还是比较麻烦的?/p> <p>Z么blogjava没有code着色功能呢Q代码脓上去一炚w不好看,唉!<img src="http://www.tkk7.com/Emoticons/msn/sad_smile.gif" alt="" /></p> <p> </p> <p> </p><img src ="http://www.tkk7.com/kebo/aggbug/52307.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/kebo/" target="_blank">kebo</a> 2006-06-13 01:19 <a href="http://www.tkk7.com/kebo/archive/2006/06/13/52307.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>excel 模板http://www.tkk7.com/kebo/archive/2006/05/23/47600.htmlkebokeboTue, 23 May 2006 03:00:00 GMThttp://www.tkk7.com/kebo/archive/2006/05/23/47600.htmlhttp://www.tkk7.com/kebo/comments/47600.htmlhttp://www.tkk7.com/kebo/archive/2006/05/23/47600.html#Feedback0http://www.tkk7.com/kebo/comments/commentRss/47600.htmlhttp://www.tkk7.com/kebo/services/trackbacks/47600.html        在企业应用中报表生成是一个无法回避的问题,Ҏ式的要求也是多种多样?br />特别是excel?直接生成需要自׃行一行的填写,ȝ之极.
利用excel模板生成excel文g.省去直接写代码生成报表之?q可以Q意设计报表样?br />免去一g格填写之?赶紧使用?)
目前基本实现了简单报表的生成的需?br />支持循环和条件判?br />控制语法如下
#if:exp
eg:
#for:#{employee}#
#for:exp
#end#exp
#elsif:exp
表达式语法ؓ:#{xxx.xxx}

其中循环中的每个元素用item表达.支持普通对?map,list,javabean,如同jstl

目前没有实现的功能嵌套语?不支持控制语句的嵌套(报表中应该不需要如此复杂的功能)和pdf?/p>

基本使用Ҏ?
        1:把kebo-0.1.jar
              commons-jexl-1.0.jar,
              commons-logging.jar,
              jxl.jar
              log4j-1.2.9.jar攑օclasspath,配置好log4j.xml(也可不配|?
        2:代码如下:
        OutputStream writer = new FileOutputStream("Book2.xls");//生成的报表文?br />  InputStream is = new FileInputStream("Book1.xls");//报表模板文g
  
  TemplateEngine engine = EngineFactory.createEngine("excel");//创徏excel报表引擎
  engine.assertObject("modul",modul);//加入数据
  Students s = new Students();
  s.setName("东");
  s.setAge("23");
  
  engine.assertObject("student",s);
  engine.assertObject("employee",modul.get("employee"));
  
  engine.evaluate(is,writer);//执行转换,生成报表
如果各位同学在用当中有问题,请及时反馈给?谢谢.mail:huang.kebo@gmail.com
源码~译,导入到eclipse?直接ant目录下的build.xml卛_

http://www.tkk7.com/Files/kebo/ReportTemplateEngine.rar

|速慢的朋?留下mail.发给你们



kebo 2006-05-23 11:00 发表评论
]]>
ajax使用感受http://www.tkk7.com/kebo/archive/2006/01/23/29045.htmlkebokeboMon, 23 Jan 2006 12:21:00 GMThttp://www.tkk7.com/kebo/archive/2006/01/23/29045.htmlhttp://www.tkk7.com/kebo/comments/29045.htmlhttp://www.tkk7.com/kebo/archive/2006/01/23/29045.html#Feedback0http://www.tkk7.com/kebo/comments/commentRss/29045.htmlhttp://www.tkk7.com/kebo/services/trackbacks/29045.html然后q回l前?前台用eval方便的拿到的js对象.比较单快?了前台的xml解析.
      但现在还q来看这些写的脚本和面,非常隄?目l的Z说看h比较困难.而且现在要修改一些东西的?也比较难扑ֈ地方.
     感受用ajax,必须有一个成熟的框架,把一些基的东西封装好,只有q样,隐藏具体的数据{换和面生成
但是也试用了一些开源的ajax框架,q没扑ֈ满意,方便的框?现在的ajax框架满天?希望06q有一个框架可以脱颖而出.

kebo 2006-01-23 20:21 发表评论
]]>
正则表达式系l教E?----------(?http://www.tkk7.com/kebo/archive/2006/01/22/28940.htmlkebokeboSun, 22 Jan 2006 06:28:00 GMThttp://www.tkk7.com/kebo/archive/2006/01/22/28940.htmlhttp://www.tkk7.com/kebo/comments/28940.htmlhttp://www.tkk7.com/kebo/archive/2006/01/22/28940.html#Feedback0http://www.tkk7.com/kebo/comments/commentRss/28940.htmlhttp://www.tkk7.com/kebo/services/trackbacks/28940.html前言

  正则表达式是烦琐的,但是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感。只要认真去阅读q些资料Q加上应用的时候进行一定的参考,掌握正则表达式不是问题?BR>
索引

1. 引子
  目前Q正则表辑ּ已经在很多Y件中得到q泛的应用,包括*nixQLinux, Unix{)QHP{操作系l,PHPQC#QJava{开发环境,以及很多的应用Y件中Q都可以看到正则表达式的影子?BR>
  正则表达式的使用Q可以通过单的办法来实现强大的功能。ؓ了简单有效而又不失强大Q造成了正则表辑ּ代码的难度较大,学习h也不是很ҎQ所以需要付Z些努力才行,入门之后参照一定的参考,使用hq是比较单有效的?BR>
  例子Q?^.+@.+\\..+$

  q样的代码曾l多ơ把我自q吓退q。可能很多h也是被这L代码l吓跑的吧。l阅L文将让你也可以自由应用这L代码?BR>
  注意Q这里的W?部分跟前面的内容看v来似乎有些重复,目的是把前面表格里的部分重新描述了一ơ,目的是让q些内容更容易理解?BR>2. 正则表达式的历史

  正则表达式的“祖先”可以一直上溯至对hcȝl系l如何工作的早期研究。Warren McCulloch ?Walter Pitts q两位神l生理学家研I出一U数学方式来描述q些经|络?BR>
  1956 q? 一位叫 Stephen Kleene 的数学家?McCulloch ?Pitts 早期工作的基上,发表了一标题ؓ“神l网事g的表C法”的论文Q引入了正则表达式的概念。正则表辑ּ是用来描述他称为“正则集的代数”的表达式,因此采用“正则表辑ּ”这个术语?BR>
  随后Q发现可以将q一工作应用于?Ken Thompson 的计搜索算法的一些早期研IӞKen Thompson ?Unix 的主要发明h。正则表辑ּ的第一个实用应用程序就?Unix 中的 qed ~辑器?BR>
  如他们所_剩下的就是众所周知的历史了。从那时L至现在正则表辑ּ都是Z文本的编辑器和搜索工具中的一个重要部分?BR>3. 正则表达式定?BR>
  正则表达?regular expression)描述了一U字W串匚w的模式,可以用来查一个串是否含有某种子串、将匚w的子串做替换或者从某个串中取出W合某个条g的子串等?BR>
  列目录时Q dir *.txt或ls *.txt中的*.txt׃是一个正则表辑ּ,因ؓq里*与正则式?的含义是不同的?

  正则表达式是由普通字W(例如字符 a ?zQ以及特D字W(UCؓ元字W)l成的文字模式。正则表辑ּ作ؓ一个模板,某个字W模式与所搜烦的字W串q行匚w?BR>
  3.1 普通字W?BR>
  由所有那些未昑ּ指定为元字符的打印和非打印字W组成。这包括所有的大写和小写字母字W,所有数字,所有标点符号以及一些符受?

  3.2 非打印字W?BR>
字符 含义
\cx 匚w由x指明的控制字W。例如, \cM 匚w一?Control-M 或回车符。x 的值必Mؓ A-Z ?a-z 之一。否则,?c 视ؓ一个原义的 'c' 字符?/TD>
\f 匚w一个换늬。等价于 \x0c ?\cL?/TD>
\n 匚w一个换行符。等价于 \x0a ?\cJ?/TD>
\r 匚w一个回车符。等价于 \x0d ?\cM?/TD>
\s 匚wMI白字符Q包括空根{制表符、换늬{等。等价于 [ \f\n\r\t\v]?/TD>
\S 匚wM非空白字W。等价于 [^ \f\n\r\t\v]?/TD>
\t 匚w一个制表符。等价于 \x09 ?\cI?/TD>
\v 匚w一个垂直制表符。等价于 \x0b ?\cK?/TD>

 
  3.3 Ҏ字符

  所谓特D字W,是一些有Ҏ含义的字W,如上面说?*.txt"中的*Q简单的说就是表CZQ何字W串的意思。如果要查找文g名中有*的文Ӟ则需要对Q进行{义,卛_其前加一个\。ls \*.txt。正则表辑ּ有以下特D字W?BR>
特别字符 说明
$ 匚w输入字符串的l尾位置。如果设|了 RegExp 对象?Multiline 属性,?$ 也匹?'\n' ?'\r'。要匚w $ 字符本nQ请使用 \$?/TD>
( ) 标记一个子表达式的开始和l束位置。子表达式可以获取供以后使用。要匚wq些字符Q请使用 \( ?\)?/TD>
* 匚w前面的子表达式零ơ或多次。要匚w * 字符Q请使用 \*?/TD>
+ 匚w前面的子表达式一ơ或多次。要匚w + 字符Q请使用 \+?/TD>
. 匚w除换行符 \n之外的Q何单字符。要匚w .Q请使用 \?/TD>
[ 标记一个中括号表达式的开始。要匚w [Q请使用 \[?/TD>
? 匚w前面的子表达式零ơ或一ơ,或指明一个非贪婪限定W。要匚w ? 字符Q请使用 \??/TD>
\ 下一个字W标Cؓ或特D字W、或原义字符、或向后引用、或八进制{义符。例如, 'n' 匚w字符 'n'?\n' 匚w换行W。序?'\\' 匚w "\"Q?'\(' 则匹?"("?/TD>
^ 匚w输入字符串的开始位|,除非在方括号表达式中使用Q此时它表示不接受该字符集合。要匚w ^ 字符本nQ请使用 \^?/TD>
{ 标记限定W表辑ּ的开始。要匚w {Q请使用 \{?/TD>
| 指明两项之间的一个选择。要匚w |Q请使用 \|?/TD>


  构造正则表辑ּ的方法和创徏数学表达式的Ҏ一栗也是用多U元字符与操作符小的表辑ּl合在一h创徏更大的表辑ּ。正则表辑ּ的组件可以是单个的字W、字W集合、字W范围、字W间的选择或者所有这些组件的Ll合?
 

  3.4 限定W?BR>
  限定W用来指定正则表辑ּ的一个给定组件必要出现多少ơ才能满_配。有*??或{n}或{n,}或{n,m}?U?BR>
  *??限定W都是贪婪的Q因为它们会可能多的匹配文字,只有在它们的后面加上一?可以实现非贪婪或最匹配?BR>
  正则表达式的限定W有Q?BR>
字符 描述
* 匚w前面的子表达式零ơ或多次。例如,zo* 能匹?"z" 以及 "zoo"? {h于{0,}?/TD>
+ 匚w前面的子表达式一ơ或多次。例如,'zo+' 能匹?"zo" 以及 "zoo"Q但不能匚w "z"? {h?{1,}?/TD>
? 匚w前面的子表达式零ơ或一ơ。例如,"do(es)?" 可以匚w "do" ?"does" 中的"do" ? {h?{0,1}?/TD>
{n} n 是一个非负整数。匹配确定的 n ơ。例如,'o{2}' 不能匚w "Bob" 中的 'o'Q但是能匚w "food" 中的两个 o?/TD>
{n,} n 是一个非负整数。至匹配n ơ。例如,'o{2,}' 不能匚w "Bob" 中的 'o'Q但能匹?"foooood" 中的所?o?o{1,}' {h?'o+'?o{0,}' 则等价于 'o*'?/TD>
{n,m} m ?n 均ؓ非负整数Q其中n <= m。最匹?n ơ且最多匹?m ơ。例如,"o{1,3}" 匹?"fooooood" 中的前三?o?o{0,1}' {h?'o?'。请注意在逗号和两个数之间不能有空根{?/TD>


  3.5 定位W?/STRONG>

  用来描述字符串或单词的边界,^?分别指字W串的开始与l束Q\b描述单词的前或后边界Q\B表示非单词边界?SPAN style="COLOR: rgb(255,0,0)">不能对定位符使用限定W?

  3.6 选择

  用圆括号所有选择ҎhQ相ȝ选择之间用|分隔。但用圆括号会有一个副作用Q是相关的匹配会被缓存,此时可用?:攑֜W一个选项前来消除q种副作用?BR>
  其中?:是非捕获元之一Q还有两个非捕获元是?=?!Q这两个q有更多的含义,前者ؓ正向预查Q在M开始匹配圆括号内的正则表达式模式的位置来匹配搜索字W串Q后者ؓ负向预查Q在M开始不匚w该正则表辑ּ模式的位|来匚w搜烦字符丌Ӏ?

  3.7 后向引用

  对一个正则表辑ּ模式或部分模式两Ҏ加圆括号导致相兛_配存储到一个时缓冲区中,所捕获的每个子匚w都按照在正则表达式模式中从左臛_所遇到的内容存储。存储子匚w的缓冲区~号?1 开始,q箋~号直至最?99 个子表达式。每个缓冲区都可以?'\n' 讉KQ其?n Z个标识特定缓冲区的一位或两位十进制数?BR>
  可以使用非捕获元字符 '?:', '?=', or '?!' 来忽略对相关匚w的保存?
4. 各种操作W的q算优先U?BR>
  相同优先U的从左到右q行q算Q不同优先的运先高后低。各U操作符的优先从高C如下Q?BR>
操作W? 描述
\ 转义W?/TD>
(), (?:), (?=), [] 圆括号和Ҏ?/TD>
*, +, ?, {n}, {n,}, {n,m} 限定W?/TD>
^, $, \anymetacharacter 位置和顺?/TD>
| “或”操?/TD>
5. 全部W号解释

字符 描述
\ 下一个字W标Cؓ一个特D字W、或一个原义字W、或一?向后引用、或一个八q制转义W。例如,'n' 匚w字符 "n"?\n' 匚w一个换行符。序?'\\' 匚w "\" ?"\(" 则匹?"("?/TD>
^ 匚w输入字符串的开始位|。如果设|了 RegExp 对象?Multiline 属性,^ 也匹?'\n' ?'\r' 之后的位|?/TD>
$ 匚w输入字符串的l束位置。如果设|了RegExp 对象?Multiline 属性,$ 也匹?'\n' ?'\r' 之前的位|?/TD>
* 匚w前面的子表达式零ơ或多次。例如,zo* 能匹?"z" 以及 "zoo"? {h于{0,}?/TD>
+ 匚w前面的子表达式一ơ或多次。例如,'zo+' 能匹?"zo" 以及 "zoo"Q但不能匚w "z"? {h?{1,}?/TD>
? 匚w前面的子表达式零ơ或一ơ。例如,"do(es)?" 可以匚w "do" ?"does" 中的"do" ? {h?{0,1}?/TD>
{n} n 是一个非负整数。匹配确定的 n ơ。例如,'o{2}' 不能匚w "Bob" 中的 'o'Q但是能匚w "food" 中的两个 o?/TD>
{n,} n 是一个非负整数。至匹配n ơ。例如,'o{2,}' 不能匚w "Bob" 中的 'o'Q但能匹?"foooood" 中的所?o?o{1,}' {h?'o+'?o{0,}' 则等价于 'o*'?/TD>
{n,m} m ?n 均ؓ非负整数Q其中n <= m。最匹?n ơ且最多匹?m ơ。例如,"o{1,3}" 匹?"fooooood" 中的前三?o?o{0,1}' {h?'o?'。请注意在逗号和两个数之间不能有空根{?/TD>
? 当该字符紧跟在Q何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面Ӟ匚w模式是非贪婪的。非贪婪模式可能少的匹配所搜烦的字W串Q而默认的贪婪模式则尽可能多的匚w所搜烦的字W串。例如,对于字符?"oooo"Q?o+?' 匹配单?"o"Q?'o+' 匹配所?'o'?/TD>
. 匚w?"\n" 之外的Q何单个字W。要匚w包括 '\n' 在内的Q何字W,请用象 '[.\n]' 的模式?/TD>
(pattern) 匚w pattern q获取这一匚w。所获取的匹配可以从产生?Matches 集合得到Q在VBScript 中?SubMatches 集合Q在JScript 中则使用 $0?9 属性。要匚w圆括号字W,请?'\(' ?'\)'?/TD>
(?:pattern) 匚w pattern 但不获取匚wl果Q也是说这是一个非获取匚wQ不q行存储供以后用。这在?"? 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 是一个比 'industry|industries' 更简略的表达式?/TD>
(?=pattern) 正向预查Q在M匚w pattern 的字W串开始处匚w查找字符丌Ӏ这是一个非获取匚wQ也是_该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹?"Windows 2000" 中的 "Windows" Q但不能匚w "Windows 3.1" 中的 "Windows"。预查不消耗字W,也就是说Q在一个匹配发生后Q在最后一ơ匹配之后立卛_始下一ơ匹配的搜烦Q而不是从包含预查的字W之后开始?/TD>
(?!pattern) 负向预查Q在M不匹?pattern 的字W串开始处匚w查找字符丌Ӏ这是一个非获取匚wQ也是_该匹配不需要获取供以后使用。例?Windows (?!95|98|NT|2000)' 能匹?"Windows 3.1" 中的 "Windows"Q但不能匚w "Windows 2000" 中的 "Windows"。预查不消耗字W,也就是说Q在一个匹配发生后Q在最后一ơ匹配之后立卛_始下一ơ匹配的搜烦Q而不是从包含预查的字W之后开?/TD>
x|y 匚w x ?y。例如,'z|food' 能匹?"z" ?"food"?(z|f)ood' 则匹?"zood" ?"food"?/TD>
[xyz] 字符集合。匹配所包含的Q意一个字W。例如, '[abc]' 可以匚w "plain" 中的 'a'?/TD>
[^xyz] 负值字W集合。匹配未包含的Q意字W。例如, '[^abc]' 可以匚w "plain" 中的'p'?/TD>
[a-z] 字符范围。匹配指定范围内的Q意字W。例如,'[a-z]' 可以匚w 'a' ?'z' 范围内的L写字母字符?/TD>
[^a-z] 负值字W范围。匹配Q何不在指定范围内的Q意字W。例如,'[^a-z]' 可以匚wM不在 'a' ?'z' 范围内的L字符?/TD>
\b 匚w一个单词边界,也就是指单词和空格间的位|。例如, 'er\b' 可以匚w"never" 中的 'er'Q但不能匚w "verb" 中的 'er'?/TD>
\B 匚w非单词边界?er\B' 能匹?"verb" 中的 'er'Q但不能匚w "never" 中的 'er'?/TD>
\cx 匚w?x 指明的控制字W。例如, \cM 匚w一?Control-M 或回车符。x 的值必Mؓ A-Z ?a-z 之一。否则,?c 视ؓ一个原义的 'c' 字符?/TD>
\d 匚w一个数字字W。等价于 [0-9]?/TD>
\D 匚w一个非数字字符。等价于 [^0-9]?/TD>
\f 匚w一个换늬。等价于 \x0c ?\cL?/TD>
\n 匚w一个换行符。等价于 \x0a ?\cJ?/TD>
\r 匚w一个回车符。等价于 \x0d ?\cM?/TD>
\s 匚wMI白字符Q包括空根{制表符、换늬{等。等价于 [ \f\n\r\t\v]?/TD>
\S 匚wM非空白字W。等价于 [^ \f\n\r\t\v]?/TD>
\t 匚w一个制表符。等价于 \x09 ?\cI?/TD>
\v 匚w一个垂直制表符。等价于 \x0b ?\cK?/TD>
\w 匚w包括下划U的M单词字符。等价于'[A-Za-z0-9_]'?/TD>
\W 匚wM非单词字W。等价于 '[^A-Za-z0-9_]'?/TD>
\xn 匚w nQ其?n 为十六进制{义倹{十六进制{义值必Mؓ定的两个数字长。例如,'\x41' 匚w "A"?\x041' 则等价于 '\x04' & "1"。正则表辑ּ中可以?ASCII ~码?
\num 匚w numQ其?num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匚w两个q箋的相同字W?/TD>
\n 标识一个八q制转义值或一个向后引用。如?\n 之前臛_ n 个获取的子表辑ּQ则 n 为向后引用。否则,如果 n 为八q制数字 (0-7)Q则 n Z个八q制转义倹{?/TD>
\nm 标识一个八q制转义值或一个向后引用。如?\nm 之前臛_?nm 个获得子表达式,?nm 为向后引用。如?\nm 之前臛_?n 个获取,?n Z个后跟文?m 的向后引用。如果前面的条g都不满Q若 n ?m 均ؓ八进制数?(0-7)Q则 \nm 匹配八q制转义?nm?/TD>
\nml 如果 n 为八q制数字 (0-3)Q且 m ?l 均ؓ八进制数?(0-7)Q则匚w八进制{义?nml?/TD>
\un 匚w nQ其?n 是一个用四个十六q制数字表示?Unicode 字符。例如, \u00A9 匚w版权W号 (?)?/TD>
6. 部分例子

正则表达?/TH> 说明
/\b([a-z]+) \1\b/gi 一个单词连l出现的位置
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/ 一个URL解析为协议、域、端口及相对路径
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/ 定位章节的位|?/TD>
/[-a-z]/ A至z?6个字母再加一?受?/TD>
/ter\b/ 可匹配chapterQ而不能terminal
/\Bapt/ 可匹配chapterQ而不能aptitude
/Windows(?=95 |98 |NT )/ 可匹配Windows95或Windows98或WindowsNT,当找C个匹配后Q从Windows后面开始进行下一ơ的索匹配?/TD>
7. 正则表达式匹配规?BR>
  7.1 基本模式匚w

  一切从最基本的开始。模式,是正规表辑ּ最基本的元素,它们是一l描q字W串特征的字W。模式可以很单,由普通的字符串组成,也可以非常复杂,往往用特D的字符表示一个范围内的字W、重复出玎ͼ或表CZ下文。例如:

  ^once

  q个模式包含一个特D的字符^Q表C模式只匹配那些以once开头的字符丌Ӏ例如该模式与字W串"once upon a time"匚wQ与"There once was a man from NewYork"不匹配。正如如^W号表示开头一P$W号用来匚w那些以给定模式结字符丌Ӏ?BR>
  bucket$

  q个模式?Who kept all of this cash in a bucket"匚wQ与"buckets"不匹配。字W^?同时使用Ӟ表示_匚wQ字W串与模式一P。例如:

  ^bucket$

  只匹配字W串"bucket"。如果一个模式不包括^?Q那么它与Q何包含该模式的字W串匚w。例如:模式

  once

  与字W串

  There once was a man from NewYork
  Who kept all of his cash in a bucket.

  是匹配的?BR>
  在该模式中的字母(o-n-c-e)是字面的字符Q也是_他们表示该字母本w,数字也是一L。其他一些稍微复杂的字符Q如标点W号和白字符Q空根{制表符{)Q要用到转义序列。所有的转义序列都用反斜?\)打头。制表符的{义序列是Q\t。所以如果我们要一个字W串是否以制表符开_可以用这个模式:

  ^\t

  cM的,用\n表示“新行”,\r表示回R。其他的ҎW号Q可以用在前面加上反斜杠Q如反斜杠本w用\\表示Q句?用\.表示Q以此类推?BR>
  7.2 字符?BR>
  在INTERNET的程序中Q正规表辑ּ通常用来验证用户的输入。当用户提交一个FORM以后Q要判断输入的电话号码、地址、EMAIL地址、信用卡L{是否有效,用普通的Z字面的字W是不够的?BR>
  所以要用一U更自由的描q我们要的模式的办法Q它是字符。要建立一个表C所有元韛_W的字符,把所有的元音字符攑֜一个方括号里:

  [AaEeIiOoUu]

  q个模式与Q何元韛_W匹配,但只能表CZ个字W。用q字号可以表CZ个字W的范围Q如Q?BR>
  [a-z] //匚w所有的写字母
  [A-Z] //匚w所有的大写字母
  [a-zA-Z] //匚w所有的字母
  [0-9] //匚w所有的数字
  [0-9\.\-] //匚w所有的数字Q句号和减号
  [ \f\r\t\n] //匚w所有的白字W?

  同样的,q些也只表示一个字W,q是一个非帔R要的。如果要匚w一个由一个小写字母和一位数字组成的字符Ԍ比如"z2"?t6"?g7"Q但不是"ab2"?r2d3" ?b52"的话Q用q个模式Q?BR>
  ^[a-z][0-9]$

  管[a-z]代表26个字母的范围Q但在这里它只能与第一个字W是写字母的字W串匚w?BR>
  前面曄提到^表示字符串的开_但它q有另外一个含义。当在一l方括号里用^是,它表C“非”或“排除”的意思,常常用来剔除某个字符。还用前面的例子Q我们要求第一个字W不能是数字Q?BR>
  ^[^0-9][0-9]$

  q个模式?&5"?g7"?-2"是匹配的Q但?12"?66"是不匚w的。下面是几个排除特定字符的例子:

  [^a-z] //除了写字母以外的所有字W?
  [^\\\/\^] //除了(\)(/)(^)之外的所有字W?
  [^\"\'] //除了双引?")和单引号(')之外的所有字W?

  Ҏ字符"." (点,句号)在正规表辑ּ中用来表C除了“新行”之外的所有字W。所以模?^.5$"与Q何两个字W的、以数字5l尾和以其他非“新行”字W开头的字符串匹配。模?."可以匚wM字符Ԍ除了IZ和只包括一个“新行”的字符丌Ӏ?BR>
  PHP的正规表辑ּ有一些内|的通用字符,列表如下Q?BR>
  字符含?

  [[:alpha:]] M字母
  [[:digit:]] M数字
  [[:alnum:]] M字母和数?
  [[:space:]] M白字W?
  [[:upper:]] M大写字母
  [[:lower:]] M写字母
  [[:punct:]] M标点W号
  [[:xdigit:]] M16q制的数字,相当于[0-9a-fA-F]

  7.3 定重复出现

  到现在ؓ止,你已l知道如何去匚w一个字母或数字Q但更多的情况下Q可能要匚w一个单词或一l数字。一个单词有若干个字母组成,一l数字有若干个单数组成。跟在字W或字符后面的花括?{})用来定前面的内容的重复出现的次数?

  字符?含义
  ^[a-zA-Z_]$ 所有的字母和下划线
  ^[[:alpha:]]{3}$ 所有的3个字母的单词
  ^a$ 字母a
  ^a{4}$ aaaa
  ^a{2,4}$ aa,aaa或aaaa
  ^a{1,3}$ a,aa或aaa
  ^a{2,}$ 包含多于两个a的字W串
  ^a{2,} 如:aardvark和aaabQ但apple不行
  a{2,} 如:baad和aaaQ但Nantucket不行
  \t{2} 两个制表W?
  .{2} 所有的两个字符

  q些例子描述了花括号的三U不同的用法。一个数字,{x}的意思是“前面的字符或字W簇只出现xơ”;一个数字加逗号Q{x,}的意思是“前面的内容出现x或更多的ơ数”;两个用逗号分隔的数字,{x,y}表示“前面的内容臛_出现xơ,但不过yơ”。我们可以把模式扩展到更多的单词或数字:

  ^[a-zA-Z0-9_]{1,}$ //所有包含一个以上的字母、数字或下划U的字符?
  ^[0-9]{1,}$ //所有的正数
  ^\-{0,1}[0-9]{1,}$ //所有的整数
  ^\-{0,1}[0-9]{0,}\.{0,1}[0-9]{0,}$ //所有的数

  最后一个例子不太好理解Q是吗?q么看吧Q与所有以一个可选的负号(\-{0,1})开?^)、跟着0个或更多的数?[0-9]{0,})、和一个可选的数?\.{0,1})再跟?个或多个数字([0-9]{0,})Qƈ且没有其他Q何东?$)。下面你知道能够用的更ؓ单的Ҏ?BR>
  Ҏ字符"?"与{0,1}是相{的Q它们都代表着Q?个或1个前面的内容”或“前面的内容是可选的”。所以刚才的例子可以化ؓQ?BR>
  ^\-?[0-9]{0,}\.?[0-9]{0,}$

  Ҏ字符"*"与{0,}是相{的Q它们都代表着?个或多个前面的内容”。最后,字符"+"?{1,}是相{的Q表C?个或多个前面的内容”,所以上面的4个例子可以写成:

  ^[a-zA-Z0-9_]+$ //所有包含一个以上的字母、数字或下划U的字符?
  ^[0-9]+$ //所有的正数
  ^\-?[0-9]+$ //所有的整数
  ^\-?[0-9]*\.?[0-9]*$ //所有的数

  当然qƈ不能从技术上降低正规表达式的复杂性,但可以它们更容易阅诅R?img src ="http://www.tkk7.com/kebo/aggbug/28940.html" width = "1" height = "1" />

kebo 2006-01-22 14:28 发表评论
]]>
վ֩ģ壺 91Ѹվ| ëƬa߹ۿ67194| ޵һվ| ŮƬѹۿƵ| ɫaվ| Դ| ƷĻƵ| Ļĸ| ޳߹ۿ| ޹aƷ| 91þþƷһ| 337pձŷ޴| ޹Ʒ˾Ʒ| Ů˱Ƶվ| 鶹˴ýѹۿ| ޹AV| þҹɫƷAV̬ͼ| Ʒ鶹վ| պ߲Ƶһ| Ůվ| һ| һĹ˾| ôͺˬƵ| ԴԴѹۿ| ɫ޵һ| ޴ɫ߹ۿ| ÿ޻ɫ| ղƵ߹ۿ| 18paoƵ| Ʒhdѹۿ| þþþþavѿ| ëƬһëƬ| ˾þô߽| ŮڵƵվ| 30Ů˺ѹۿ| þƵ| ŮоƷվѹۿ| ޹ŷۺһ | һ| ˳ۺ| ѹۿAVƬ|