星期日, 三月 18, 2007

Jigloo

今天在blogjava上发现一个好东西Jigloo,这个eclipse插件可以实现jbuilder的组件拖放功能,虽然生成的代码不怎么样,不过适合制作界面,减少编码量,支持awt,swing/swt。
下载地址

星期六, 三月 17, 2007

手办·回梦

前几天就打算去看看手办的价格及买几个萌物回家。昨天下定决心今天要去文庙和福佑路看看。今天算是比较早的起来了,乘上车到了老西门。从老西门一路走到文庙,路上的景物还是和原来差不多,只不过人民路西侧全部给拆了,只剩下东侧的建筑。慢步踱进文庙,以前的少年宫现在是门面装修一新连大号都改成了黄浦区青少年活动中心,3幢楼的外侧也翻修一新,从外面看起来十分亮堂,比起以前的少年宫,虽然占地面积没有任何扩充,也一样给人眼前一新的感觉。右侧敬业的后门也用新的围墙围了起来,比以前脏乱差好多了。在老道前街发现了第一家卖手办的店,说是手办不如说是一家卖扭蛋的商店,店里摆放了10来个扭蛋机器,外面陈列着数以百计的扭蛋中的小玩艺。不过在我看来这只不过是一些小朋友玩的东西便走了出去。旁边又是2家动漫周边店,这才是有意义的手办店,虽然2家的品种还是蛮多的,不过还是以广东制作的小中手办为主,只有为数不多的舶来品,没有看中什么。在对面又发现一家卖cos服装的店,这个就没有进去看,本人非制服控,再说也难有3d物能萌到偶,直接略过。
继续沿着文庙路向前行,左右的饰品店不少,不过非偶所好,也没有空进去一探究竟。到了学宫街犹豫了0.01s还是决定先走完文庙路再取道学宫街,之后在文庙路上又觅到4处动漫周边店,特别是一家极其小的店还接受预定,这家店不错,其他几家也很好,起码萌物比老道前街多了许多。由于还没有去过富明街,也就随处瞧了瞧。慢慢的走出了文庙路,转道柳江街,回二还是矗立在那里,只不过给人感觉沧桑了许多,外墙的爬山虎也是枯黄的,后门还是一如既往的给旁边的住户当晾晒衣服的架子来使用。以前的小店还在那里,老朱的外婆还在那小小的店里坐着,店中出售的还是些小孩子喜欢且便宜的小食品和饮料,不禁想起了小学时一放学就跑到小店里买点老鼠屎什么的。再看回二的铭牌也变成了黄浦区回民小学,看看回二还是那么的大(对于小学来说)3幢教育楼,3个操场,还有那喜欢和我们一起玩,一起疯的陈老师,虽然做了他2年课代表,对于唱歌到如今还是五音不全,真是汗颜。
到了梦花街,原来的馄饨摊子还在那里,原来的烟纸店还在那里,原来的粮店还在那里,原来的酱油店也在那里,唯独是物是人非,抄了几个近路,走在熟悉又陌生的弄堂里,发现这个已经不是记忆中孩子们玩闹的场所了。绕到学宫街,那里还是没有变,还是一排排贩卖游戏机,游戏和点卡的地方,只不过原来18块/张的魔力点卡变成了18/张魔兽点卡,还有那孔乙己酒店也冷冷清清,从外面看上去较之从前黯然了许多。
重新从梦花街反方向走,走过庄家街,来到西仓桥街,沿着西仓桥街一路往东,还有那熟悉的澡堂子,布店,清真寺,但一到河南南路,如同断了线的风筝,西仓桥街也在此处断了,没有了清真,没有了熟悉的牛肉包子,没有了倒川弄,没有了电话亭,没有了梭子弄,没有了26弄1号,没有了那又小又窄又不时会发出吱吱声的木制楼梯,没有了我家。在我面前的是一幢幢正在建设中的高楼,一辆辆吊着钢筋的吊车和一群群挥汗如雨的民工。儿时的冒险者游戏的小黑道被填埋在这下面了,儿时打乒乓用的石板桌被填埋在这下面了,儿时警察捉小偷的条条道道给填埋在这下面了,儿时打玻璃球的大空地也给填埋在这下面了……
顺着河南南路向北继续前行,原本好好的路现在变的是坑坑洼洼,这里挖个洞,那里挖个坑,对于城镇建设真是没有话说了,河南南路上熟悉的66路还是满满的一车箱人,河南南路上人比车快的定理还是一往如前,慢慢的踱着也比66路快了不知多少。沿路还是东一块,西一块的烂泥,给人以极其不爽的感觉。紫华路,上海老街,福佑路还是一如既往的车流如潮,而又只能非常非常慢的汇入河南南路那小小的主干道中。终于踱步到了福佑路小商品市场。因为前些年的改革,许多路边小摊都给弄到了2幢专卖小商品的楼中,外面只剩下以前1/5的门面了,为了方便遍历,就没有先进福佑门市场,而是沿着福佑路慢慢的走着,左右的小店里的东西一个比一个多,一个比一个个性,在外面的小店中只找到2家卖动漫周边的店而且东西还不多,就随便看了看,慢慢的绕过沉香阁回到福佑路,再钻进福佑门市场,一楼还是那乱七八糟的东西,什么都有,反正也没有仔细看。直奔2楼,先是发现一家,但没有什么好东西,继续寻找,又在一个不大的角落发现了第二家,虽然也没有好的东西,不过有个真红吸引了偶的眼球,问价钱要500+即便放弃。最后发现了一家今天找到的最大一家卖周边的店,东西很多而且价格也不贵,就是找不找偶喜欢的东西,两个夏娜都是去年发售的,给偶感觉不是很萌,虽然一个只要120,一个只要100。前些日子在网上看到的那个夏娜就没有- -;小牧爱佳的几个手办也不怎么样;如果喜欢凉宫的话,兔儿凉宫加吉他那个还算是比较萌的也不贵才95(最好在文庙最便宜的就85)不过总感觉不怎么样,还有喜欢saber的注意下,现在saber很便宜才80块一个,还是1:6的(虽然偶不萌saber,但偶知道有人萌)。再里面有逛了一个大圈,也没有什么收获。只不过价格问了个七七八八了。
沿着人民路从老北门重新走回文庙,有去原来看的那几家店去看了看,在一个角落发现了一个和原来那个一样的真红,不过也要400,贵了点,然后到我先前所述的那个可以预订的小店去问了下坐在十字架上的汞灯的情况被告知3月底就有了,到时候再去看看。又打听了下那个偶看中的那个夏娜手办还有没有,结果给告知卖完了- -。最后再次沿着方斜路走到了车站,方斜路也变化了许多,特别是中间又开出了一条小道,白云观也给迁走。不过方斜路上的书报摊和卖游戏机的店依旧在那,只不过那里的老板都已经不认识我了而已。

星期三, 三月 14, 2007

正则表达式

很早以前就接触了正则表达式,认为自己已经了解了它。然而今天看到了一篇关于正则表达式的文章,发现还有些东西是以前所不知的,特此转来,方便以后查阅。


元字符:

/b 代表着单词的开头或结尾,也就是单词的分界处.如果要精确地查找hi这个单词的话,我们应该使用/bhi/b.

.是另一个元字符,匹配除了换行符以外的任意字符,*同样是元字符,它指定*前边的内容可以重复任意次以使整个表达式得到匹配。


.*连在一起就意味着任意数量的不包含换行的字符。

/d是一个新的元字符,匹配任意的数字,0/d/d-/d/d/d/d/d/d/d/d也就是中国的电话号码.为了避免那么多烦人的重复,我们也可以这样写这个表达式:0/d{2}-/d{8}。

/s匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等。/w匹配字母或数字或下划线或汉字。

/b/w{6}/b 匹配刚好6个字母/数字的单词。

字符转义:使用/来取消这些字符的特殊意义。因此,你应该使用/.和/*。当然,要查找/本身,你也得用//。

代码 说明
. 匹配除换行符以外的任意字符
/w 匹配字母或数字或下划线或汉字
/s 匹配任意的空白符
/d 匹配数字
/b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束

重复:
常用的限定符
代码/语法 说明
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

要想查找数字,字母或数字,你只需要在中括号里列出它们就行了,像[aeiou]就匹配任何一个元音字母,[.?!]匹配标点符号(.或?或!)

反义:
常用的反义代码
代码/语法 说明
/W 匹配任意不是字母,数字,下划线,汉字的字符
/S 匹配任意不是空白符的字符
/D 匹配任意非数字的字符
/B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符


替换:
正则表达式里的替换指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用把不同的规则分隔开。
0/d{2}-/d{8}0/d{3}-/d{7}这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)。
/(0/d{2}/)[- ]?/d{8}0/d{2}[- ]?/d{8}这个表达式匹配3位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔。你可以试试用替换把这个表达式扩展成也支持4位区号的。
/d{5}-/d{4}/d{5}这个表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字,或者用连字号间隔的9位数字。之所以要给出这个例子是因为它能说明一个问题:使用替换时,顺序是很重要的。如果你把它改成/d{5}/d{5}-/d{4}的话,那么就只会匹配5位的邮编(以及9位邮编的前5位)。原因是匹配替换时,将会从左到右地测试每个分枝条件,如果满足了某个分枝的话,就不会去管其它的替换条件了。

分组:

如果想要重复一个字符串又该怎么办?你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了。
(/d{1,3}/.){3}/d{1,3}是一个简单的IP地址匹配表达式。要理解这个表达式,请按下列顺序分析它:/d{1,3}匹配1到3位的数字,(/d{1,3}/.}{3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(/d{1,3})。不幸的是,它也将匹配256.300.888.999这种不可能存在的IP地址(IP地址中每个数字都不能大于255)。如果能使用算术比较的话,或许能简单地解决这个问题,但是正则表达式中并不提供关于数学的任何功能,所以只能使用冗长的分组,选择,字符类来描述一个正确的IP地址:((2[0-4] /d25[0-5][01]?/d/d?)/.){3}(2[0-4]/d25[0-5][01]?/d/d?)。

后向引用:

后向引用用于重复搜索前面某个分组匹配的文本。例如,/1代表分组1匹配的文本。难以理解?请看示例:
/b(/w+)/b/s+/1/b可以用来匹配重复的单词,像go go, kitty kitty。首先是一个单词,也就是单词开始处和结束处之间的多于一个的字母或数字(/b(/w+)/b),然后是1个或几个空白符(/s+,最后是前面匹配的那个单词(/1)。

懒惰限定符
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复

位置指定:


接下来的四个用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们用于指定一个位置,就像/b,^,$那样,因此它们也被称为零宽断言。最好还是拿例子来说明吧:

(?=exp)也叫零宽先行断言,它匹配文本中的某些位置,这些位置的后面能匹配给定的后缀exp。比如/b/w+(?=ing/b),匹配以 ing结尾的单词的前面部分(除了ing以外的部分),如果在查找I'm singing while you're dancing.时,它会匹配sing和danc。

(?<=exp)也叫零宽后行断言,它匹配文本中的某些位置,这些位置的前面能给定的前缀匹配exp。比如(?<=/bre)/w+/b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。 假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了),你可以这样查找需要在前面和里面添加逗号的部分:((?<=/d)/d{3})*/b。请仔细分析这个表达式,它可能不像你第一眼看出来的那么简单。 下面这个例子同时使用了前缀和后缀:(?<=/s)/d+(?=/s)匹配以空白符间隔的数字(再次强调,不包括这些空白符)。 负向位置指定: 前面我们提到过怎么查找不是某个字符或不在某个字符类里的字符的方法(反义)。但是如果我们只是想要确保某个字符没有出现,但并不想去匹配它时怎么办?例如,如果我们想查找这样的单词--它里面出现了字母q,但是q后面跟的不是字母u,我们可以尝试这样: /b/w*q[^u]/w*/b匹配包含后面不是字母u的字母q的单词。但是如果多做测试(或者你思维足够敏锐,直接就观察出来了),你会发现,如果q出现在单词的结尾的话,像Iraq,Benq,这个表达式就会出错。这是因为[^u]总是匹配一个字符,所以如果q是单词的最后一个字符的话,后面的 [^u]将会匹配q后面的单词分隔符(可能是空格,或者是句号或其它的什么),后面的/w+/b将会匹配下一个单词,于是/b/w*q[^u]/w*/b 就能匹配整个Iraq fighting。负向位置指定能解决这样的问题,因为它只匹配一个位置,并不消费任何字符。现在,我们可以这样来解决这个问题:/b/w*q(?!u) /w*/b。 零宽负向先行断言(?!exp),只会匹配后缀exp不存在的位置。/d{3}(?!/d)匹配三位数字,而且这三位数字的后面不能是数字。 同理,我们可以用(?).*(?=)匹配不包含属性的简单HTML标签内里的内容。()指定了这样的前缀:被尖括号括起来的单词(比如可能是<b>),然后是.*(任意的字符串),最后是一个后缀(?=)。注意后缀里的//,它用到了前面提过的字符转义;/1则是一个反向引用,引用的正是捕获的第一组,前面的(/w +)匹配的内容,这样如果前缀实际上是<b>的话,后缀就是</b>了。整个表达式匹配的是<b>和< /b>之间的内容(再次提醒,不包括前缀和后缀本身)。

注释:
小括号的另一种用途是能过语法(?#comment)来包含注释。例如:2[0-4]/d(?#200-249)25[0-5](?#250-255)[01]?/d/d?(?#0-199)。

要包含注释的话,最好是启用“忽略模式里的空白符”选项,这样在编写表达式时能任意的添加空格,Tab,换行,而实际使用时这些都将被忽略。启用这个选项后,在#后面到这一行结束的所有文本都将被当成注释忽略掉。

例如,我们可以前面的一个表达式写成这样:

(?<= # 查找前缀,但不包含它 <(/w+)> # 查找尖括号括起来的字母或数字(标签)
) # 前缀结束
.* # 匹配任意文本
(?= # 查找后缀,但不包含它
# 查找尖括号括起来的内容:前面是一个"/",后面是先前捕获的标签
) # 后缀结束


贪婪与懒惰:
当正则表达式中包含能接受重复的限定符(指定数量的代码,例如*, {5,12}等)时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。考虑这个表达式:a.*b,它将会匹配最长的以a开始,以b 结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。

有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版的例子吧:

a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab和ab(为什么第一个匹配是aab而不是ab?简单地说,最先开始的区配最有最大的优先权??The Match That Begins Earliest Wins)。

表5.懒惰限定符 *? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复

-------------------------------------------------------

下面是一些常用的正则表达式:

匹配中文字符的正则表达式: [/u4e00-/u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了

匹配双字节字符(包括汉字在内):[^/x00-/xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

匹配空白行的正则表达式:/n/s*/r
评注:可以用来删除空白行

匹配HTML标记的正则表达式:<(/S*?)[^>]*>.*?<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力

匹配首尾空白字符的正则表达式:^/s*/s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式

匹配Email地址的正则表达式:/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*
评注:表单验证时很实用

匹配网址URL的正则表达式:[a-zA-z]+://[^/s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求

匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用

匹配国内电话号码:/d{3}-/d{8}/d{4}-/d{7}
评注:匹配形式如 0511-4405222 或 021-87888822

匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始

匹配中国邮政编码:[1-9]/d{5}(?!/d)
评注:中国邮政编码为6位数字

匹配身份证:/d{15}/d{18}
评注:中国的身份证为15位或18位

匹配ip地址:/d+/./d+/./d+/./d+
评注:提取ip地址时有用

匹配特定数字:
^[1-9]/d*$    //匹配正整数
^-[1-9]/d*$   //匹配负整数
^-?[1-9]/d*$   //匹配整数
^[1-9]/d*0$  //匹配非负整数(正整数 + 0)
^-[1-9]/d*0$   //匹配非正整数(负整数 + 0)
^[1-9]/d*/./d*0/./d*[1-9]/d*$   //匹配正浮点数
^-([1-9]/d*/./d*0/./d*[1-9]/d*)$  //匹配负浮点数
^-?([1-9]/d*/./d*0/./d*[1-9]/d*0?/.0+0)$  //匹配浮点数
^[1-9]/d*/./d*0/./d*[1-9]/d*0?/.0+0$   //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]/d*/./d*0/./d*[1-9]/d*))0?/.0+0$  //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正

匹配特定字符串:
^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
^/w+$  //匹配由数字、26个英文字母或者下划线组成的字符串

星期四, 三月 08, 2007

I'm

最近大家的msn上是不是看到了绿色的i'm标志,这是微软通过msn live8.1(低版本无法参加)启动的活动,你可以在你的msn昵称前加上一串特殊的代码(现在看来超过15种,代表不同的十五个组织),从而实现在昵称中代码处显示成“I'm”字样。据相关新闻称,所有参加此活动的慈善组织都将在此活动的第一年获得最低10万美金的捐款,最高则不设上限——上限达到多少,则取决于有多少人在自己的昵称前加上该组织的代码。

  简言之,这次活动的赞助商通过微软,来做了一次发动MSNer参与的投票。钱由他们出,而你只需要选择一个你相对顺眼的组织,挂上他们的代码。支持的人多,组织就多拿钱——是不是有点象超级女生……

  当然,如果你仅仅是为了好看,觉得这顶偏绿的小帽子还比较顺眼,而代码是别人给你的,当然也可以。但是,如果是在知情的情况下,能够装装挑选的样子,表示认真动用了表决权,那至少在别人质问你的绿帽子成色时,你能说出个子丑寅卯。

  1-9是小精子的blog、donews新闻和微软官方页面中中提到的九个组织。但通过Nue传给我的资料,已经补充到14个,大概还有更多慈善机构在不断加入。比如Tez的*one代码,请其他人帮忙追证补齐。(机构翻译方式可能有所出入)

  1.American Red Cross
  ——I'm 准备提供帮助。美国红十字协会。代码 = *red+u

  2.Boys and Girls Clubs of America  
  ——I'm 为孩子提供理想的环境。儿童群益会(美国)。代码 = *bgca


  3.National AIDS Fund          
  ——I'm 与艾滋病(AIDS)抗争。美国国家艾艾滋基金。代码 = *naf


  4.National MS Society         
  ——I'm 参与到解决多发性硬化症。国家多发性硬化症学会。= *mssoc


  5.ninemillion.org
  ——I'm 帮助9百万流离失所的孩子。国际儿童难民援助组织。代码 = *9mil


  6.Sierra Club              
  —— I'm 探索和保护这个星球。地球环境协会/山岳协会(保护自然生态)。代码 = *sierra


  7.StopGlobalWarming.org
  ——I'm 阻止全球变暖。防止全球温室效应恶化相关机构。代码 = *help


  8.Susan G. Komen for the Cure    
  ——I'm 寻找乳腺癌的治愈方法。乳腺癌基金会。代码 = *komen


  9.UNICEF
  ——I'm 救助生死边缘徘徊的孩子。美国地区联合国儿童基金会。代码= *unicef

  补:
  10.World Wildlife Fund for Nature  
  ——I'm 希望保护环境和野生动物。世界自然基金会。代码 = *wwf

  11.The Oxford Committee for Famine Relief
  ——I'm 协助解决当时世界各地饥荒以及贫困问题。乐施会。代码 = *oxfam

  12.国际关怀协会。
  ——I'm 帮帮鳏寡孤独,改善人际冷漠。代码 = *care 
  
  13.The Humane Society of the United States
  ——I'm 展现我的人道主义。代码 = *hsus

  14.American Cancer Society
  ——I'm 帮助癌症研究。代码 = *acs

  15.ONE Campaign-全球消除贫困与对抗爱滋的组织(GCAP) ·
  ——I'm 参与消除贫困和对抗AIDS。代码 = *one