国庆9天生活

essay No Comments »

一直在åšç½‘站改版,今天æ‰å‘出æ¥
第1天
上åˆ
9点起床
看了åŠä¸ªå°æ—¶çš„英语
åšæ—©é¥­ï¼Œç…®äº†ä¸€ä¸ªé¸¡è›‹
一直在看js的书,测试了几个代ç 
期间修了下键盘
下åˆ
2点钟åƒå®Œåˆé¥­å›žæ¥ï¼ŒçŽ©dota一直到3点
åˆç¡
èµ·æ¥ä¸Šç½‘,å‘现一件好事情,94share。com prå‡åˆ°5了,奇迹
到学校拿东西,åƒé¥­ï¼ŒèŠå¤©
10点回到ä½çš„地方
显å¡å了,下载新驱动

第一天还算ä¸é”™åªæ˜¯è¿›åº¦æ…¢äº†ç‚¹ï¼Œå­¦æ ¡é‡Œå·²ç»æ²¡æœ‰å¤šå°‘人了。
大多回家或者去旅游,åŒä½çš„也è¦åŽ»ä¹å¯¨æ²Ÿï¼Œç¾¡æ…•
明天å¯ä»¥äº«å—一个人的生活。

     by bin
     23:00

第2天
早上
昨天晚上,确切的说应该是今天早上,起的比较晚,9:30èµ·æ¥çš„
很久没有凌晨的时候ç¡è§‰äº†ï¼Œæ˜¨å¤©ä¹Ÿä¸çŸ¥æ€Žä¹ˆçš„ï¼Œä¸€ç‚¹ç¡æ„都没有
一直到早上5点æ‰ç¡ç€
还好,早上起æ¥ä¸æ˜¯ç‰¹åˆ«çš„å›°
先是更新了下网站大约到11:00,期间煮了泡饭
下åˆ
åƒå®Œé¥­åŽä¸€ç›´åœ¨å®žè·µjs的代ç ï¼Œç»ˆäºŽåœ¨1点的时候把一章的é‡è¦ä»£ç 
测试完毕,å‘现国外人写的代ç çœŸçš„å¾ˆè¯¦ç»†ã€‚å®Œäº†ä¸€ä¸ªå°æ—¶çš„dota
翻出一本ä¸çŸ¥é“是新是旧的书看了3/4,明天应该就å¯ä»¥çœ‹å®Œ
åˆè§‰èµ·æ¥åŽå·²ç»æ˜¯5:30多,背了下英语,å‘现速度比以å‰å¿«å¤šäº†
ä¸åˆ°åŠä¸ªå°æ—¶å°±çœ‹å®Œäº†ä»Šå¤©çš„é‡ï¼Œä¸çŸ¥é“æ˜¯ä¸æ˜¯å¾ˆæˆ‘最近一直在åƒé¸¡è›‹æœ‰å…³
今天决定自己å°è¯•ä¸‹çƒ§è›‹ç‚’é¥­ï¼Œç»“æžœé…±æ²¹æ”¾å¤šäº†ï¼Œåˆæ²¡æœ‰æ”¾ç›ï¼Œä¸è¿‡å‘³é“还算
ä¸é”™

晚上
在网上乱逛,å‘现一个laoguiåšçš„æ¨¡æ¿ï¼Œå‘现真的很漂亮,看æ¥ä¸€ä¸ª
网站的漂亮程度和颜色的é…置有很大的关系
看完了下åˆå‰©ä¸‹çš„js章节,还算ä¸é”™
打开电脑å‘现自从上次é‡è£…,连FW的都没安装,还好机å­é‡Œå·²ç»ä¸‹è¿‡
今天是我一个人的第一天,åŒä½çš„出去旅游了
想起Gitesæ¯å¹´éƒ½ä¼šæœ‰ä¸€ä¸ªæ˜ŸæœŸä¸€ä¸ªäººé£žåˆ°ä¸€ä¸ªä¸Žä¸–éš”ç»çš„å°å²›ï¼Œ
过æ€è€ƒå‘¨ï¼Œä¸çŸ¥é“我这ç§ç®—ä¸ç®—是。
     by bin
     21:46

第3天
上åˆ
今天起的更晚,快到10点æ‰èµ·æ¥
看了åŠä¸ªå°æ—¶çš„英语
出去买了点èœ

下åˆ
ç¡è§‰èµ·æ¥å·²ç»æ˜¯5:30
感觉今天过的很快

晚上
烧饭,看js的书
一直到10:30
正准备开机玩下游æˆï¼Œæ²¡æƒ³åˆ°ä¸­äº†orz。exe病毒
痛苦

今天看到很多站点都改版了
比如淘å®ï¼ŒåœŸè±†çš„下载软件也改版了
ä¸çŸ¥é“æ˜¯ä¸æ˜¯å› ä¸ºå›½åº†çš„原因
   by bin
   23:33
第4天
上åˆ
今天算是这几天中起的最早的一次
8点的时候就醒了
看了åŠä¸ªå°æ—¶çš„英语,然åŽå°±ä¸€ç›´åœ¨çœ‹js的书
今天是最åŽä¸€å¤©çœ‹js的书了,准备在这个国庆长å‡ä¸­åšä¸€ä¸ªä¸œè¥¿å‡ºæ¥ï¼Œä¸è¿‡çŽ°åœ¨è¿˜ä¸èƒ½ç¡®å®šæ˜¯åšä»€ä¹ˆï¼Œæ˜¯æŠŠåŽŸæ¥çš„代ç è¿›è¡Œé‡æž„还是用thinkphpåšå‡ºåˆ†ç±»ä¿¡æ¯å‘¢ï¼Ÿé€‰æ‹©ing
简å•çš„åƒå®Œä¸­é¥­ï¼Œåˆç¡ï¼Œç»“æžœ2:30的时候被快递公å¸çš„电è¯åµé†’
é¢†å®Œå¿«é€’åŽæ€Žä¹ˆä¹Ÿç¡ä¸ç€ï¼Œå¤–é¢çš„噪音超大
继续测试js的代ç 
大约到了5:45的时候去学校åƒäº†æ™šé¥­
有几天没有去学校了,åƒå®Œé¥­åŽä¸€ç›´åœ¨å’ŒåŒå­¦æ¸¸æˆ
ä¸çŸ¥ä¸è§‰å·²ç»2点了,ç¡è§‰ã€‚
    by bin
        次日  10:16
第5天
上åˆ
9点多起æ¥ï¼Œçœ‹äº†åŠä¸ªå°æ—¶è‹±è¯­
去买了èœï¼Œè‡ªå·±çƒ§äº†ç‚¹é¥­åƒ
本想休æ¯ä¸‹ï¼Œæ²¡æƒ³åˆ°å™ªéŸ³å¤ªå¤§æ— æ³•ç¡è§‰
一天都很疲倦

下åˆ
看了一个下åˆç”µè§†

晚上
ç¡åˆ°8点起æ¥
è‡ªå·±çƒ§äº†èŒ„å­æŠ„è‚‰ï¼Œä¸è¿‡æœ‰ç‚¹æ„Ÿè§‰åƒæ˜¯è‚‰æŠ„茄å­
ç¬¬ä¸€æ¬¡ä¸æ˜¯å¾ˆæˆåŠŸï¼ŒèŒ„å­é»‘了
开始了改版计划
åšäº†ä¸€ä¸ªheader,å‚è€ƒäº†å¾ˆå¤šç½‘ç«™ä½†æ˜¯æ€»è§‰å¾—ä¸æ»¡æ„

ä»Šå¤©åœ¨å­¦ä¹ ä¸Šçš„æ—¶é—´æœ€å°‘ï¼Œå¯æ¶çš„噪音

    by bin
    次日凌晨0:35

第6天
今天过的比较简å•
一天都在åšé¦–页
到了晚上7点的时候,基本上已ç»å®Œå·¥

今天看了é²è±«é‡‡è®¿éŸ©å¯’的视频
感觉æ¯ä¸ªäººéƒ½å¾ˆè¾›è‹¦ï¼Œåªæ˜¯è¾›è‹¦çš„æ–¹å¼ä¸åŒç½¢äº†

    by bin
    次日 7:56

第7天
这几天一直都在åšç½‘站,所以都是次日æ‰å†™

上åˆ
几天算是比较早的起æ¥
8点ä¸åˆ°å°±é†’了,然åŽä¸€ç›´åœ¨çœ‹wpçš„æºç 
一直到中åˆ
简å•çš„åƒå®Œä¸­é¥­ï¼Œç¡è§‰ä¼‘æ¯
èµ·æ¥åŽç»§ç»­wpæºç 
ä¿®å¤äº†åŽŸæ¥çš„一个问题

晚上
去学校åƒäº†æ™šé¥­åŽä¸€ç›´æ¸¸æˆ
çªç„¶å‘现现在游æˆçš„人也少了
大多都在虚晃和无èŠä¸­
æ¸æ¸çš„也觉得游æˆä¸å¥½çŽ©äº†

看了wp的官方站以åŽå‘现他的教程真的是éžå¸¸çš„
è¯¦ç»†ï¼Œè¿™æ‰æ˜¯çœŸæ­£çš„å¼€æºè½¯ä»¶

想起还有一片文章没有写,家里还是一片狼藉,è¦åŠ å¿«é€Ÿåº¦äº†
     by bin 
    次日 8:36
第8-9天
这2天一直在弄网站改版的事情,比较忙也比较累

èŒä¸šç”Ÿæ¶¯è§„划

aspire No Comments »

被逼无奈,需è¦å†™ä¸€ç¯‡èŒä¸šç”Ÿæ¶¯è§„划

 30å²ä¹‹å‰æˆåŠŸé æŠ€æœ¯ï¼Œ30-40岿ˆåŠŸé èƒ½åŠ›ï¼Œ40å²ä»¥åŽé äººè„‰
 毕业åŽåŸºæœ¬ä¸Šéƒ½ä¼šèµ°ä¸Š4æ¡è·¯ã€‚1:æ‰¾å·¥ä½œæˆ–è€…å«æ‰“工;2:é å…¬åŠ¡å‘˜ï¼›3:考研;4自
主创业。自从盖茨和æ¨è‡´è¿œæˆåŠŸåˆ›åŠžå¾®è½¯ï¼ˆmicrosoft)和雅虎(yahoo)之åŽï¼Œå¤§å­¦ç”Ÿé€‰æ‹©
创业的èŒèŠ½å°±å¼€å§‹äº†ã€‚åŠ ä¸Š80åŽçš„ä»£è¡¨æŽæƒ³å’Œé«˜ç‡ƒï¼Œåˆç»™æ¯•业åŽé€‰æ‹©åˆ›ä¸šåŠ äº†ä¸€æŠŠç«ã€‚åˆæœ‰
现在的狂人马云说的â€å¦‚果我能æˆåŠŸï¼Œä¸­å›½80%的年轻人创业都能æˆåŠŸâ€œï¼ŒçŽ°åœ¨æ”¿åºœä¹Ÿç»™å¤§
学毕业åŽé€‰æ‹©è‡ªä¸»åˆ›ä¸šæä¾›äº†å¾ˆå¤šä¾¿åˆ©ã€‚ä¼¼ä¹ŽçŠ¹å¦‚é›¨åŽæ˜¥ç¬‹ï¼Œä¸æ–­å†’出。
Â å†™è¿™ä¹ˆå¤šï¼Œå¹¶ä¸æ˜¯è¯´æˆ‘è¦åŽ»é€‰æ‹©åˆ›ä¸šï¼Œä½†æ˜¯ä¸ºä»€ä¹ˆè¦å†™è¿™ä¹ˆå¤šï¼Œå› ä¸ºè¿™ä¸ªæ›¾ç»æ˜¯æˆ‘
å¤§ä¸€æ—¶å€™çš„æƒ³æ³•ã€‚è‡³äºŽä¸ºä»€ä¹ˆè¦æ”¾å¼ƒï¼Ÿçœ‹çœ‹ç›–茨,æ¨è‡´è¿œï¼ŒæŽæƒ³ï¼Œé«˜ç‡ƒï¼Œæ²¡æœ‰ä¸€ä¸ªæ˜¯å¤§å­¦æ¯•
ä¸šçš„ï¼Œå¾ˆé—æ†¾æˆ‘选择了大学毕业。简å•说下我的èŒä¸šè§„划。
 1ï¼šæ¯•ä¸šåŽæ‰¾ä¸€ä¸ªå…³äºŽphp的工作。希望工资在2000-4500之间,最好是能有5险1金
。为什么è¦é€‰æ‹©å’Œphp有关的。原因很简å•ï¼Œæˆ‘è‡ªä»Žå­¦ä¹ è¿™ä¸ªåˆ°çŽ°åœ¨å¤§çº¦å·²ç»æœ‰5年的时间。
å› ä¸ºä¸“æ³¨æ‰€ä»¥ä¸“ä¸šï¼Œè‡³å°‘æˆ‘è¦æ¯”我们学校,甚至江西çœåœ¨æ ¡çš„大学生更有优势。在大学期间
基本上是æ¯ä¸ªæ˜ŸæœŸ1æœ¬ä¹¦ï¼Œçœ‹çš„å¹¶ä¸æ˜¯ä¸“业的,而是关于å„大公å¸çš„èµ·å®¶å’Œå‘展历å²ï¼Œæˆ–者
说是MBA的书。这个和我的èŒä¸šè§„划的第2步有关。
 2:在30å²ä»¥å‰ï¼Œå¸Œæœ›èƒ½è®¤è¯†ä¸€ç¾¤ï¼Œæœ‰ç†å¿µï¼Œæœ‰æ¢¦æƒ³ï¼Œå¹¶ä¸”有素质的朋å‹ã€‚专注,
åšæŒï¼Œè¯šä¿¡ï¼Œå›¢é˜Ÿåˆä½œï¼Œå®¢æˆ·ç¬¬ä¸€ï¼Œæ‹¥æŠ±å˜åŒ–,这些是最基本的。这段时间最好能赚到一部
分资金,大约在30W-100W之间。
 3ï¼šå¹¶ä¸æ˜¯èƒ½å®žçŽ°çš„æ¢¦æƒ³ã€‚åœ¨80å²çš„æ—¶å€™ï¼Œæ‰“造一个由中国创造,世界å“牌的ä¼ä¸š
,åƒï¼šè¯ºåŸºäºšï¼Œå¯å£å¯ä¹ä¸€æ ·çš„å…¬å¸ã€‚为什么ä¸ç”¨åˆ›åŠžï¼Ÿæˆ‘å¸Œæœ›æˆ‘åœ¨å·¥ä½œçš„æ—¶å€™é€‰æ‹©ä¼ä¸šçš„
时候,这个ä¼ä¸šå°±æ˜¯ä¸€å®¶èƒ½å¤Ÿæˆä¸ºè¿™æ ·çš„å…¬å¸ã€‚如果ä¸èƒ½æˆ‘会创造一家这样的公å¸ã€‚这个梦
想也许一辈å­éƒ½æ— æ³•实现,ä¸è¿‡æˆ‘会一直去æœè¿™ä¸ªæ–¹å‘å‘展一直到结æŸã€‚其实说出这个大多都会被嘲笑,看ä¸èµ·ï¼Œæˆ–者说是痴人说梦。创业,尤其是在中
国创业是件éžå¸¸éžå¸¸éš¾çš„事情.åœ¨ç”µè„‘æ–¹é¢æˆ–者说是在ITæ–¹é¢ï¼Œè¦æƒ³æˆåŠŸåªæœ‰2中å¯èƒ½ï¼Œ1:
大资本;2:æ–°æŠ€æœ¯ã€‚éœ€è¦æœ‰åŠå…¶å¼ºå¤§çš„äººè„‰ï¼Œéœ€è¦æœ‰éžå¸¸éžå¸¸ä¼˜ç§€çš„åˆä½œä¼™ä¼´ï¼Œéœ€è¦æœ‰å¥½çš„
想法,并且åšçš„æ—¶å€™ä¸èƒ½è®©åŽŸæœ‰çš„å¤§å…¬å¸å‘现这个想法的æˆåŠŸçš„ã€‚åŸºæœ¬ä¸Šæ˜¯è¦è®©å¯¹æ‰‹ï¼šçœ‹ä¸
è§ï¼Œçœ‹ä¸èµ·ï¼Œçœ‹ä¸æ‡‚,跟ä¸ä¸Šã€‚如果是创办一家长久的ä¼ä¸šï¼Œäº§å“一定是è¦èƒ½å¤Ÿåˆ›é€ ä»·å€¼ï¼Œ
为人类的生活带æ¥äº›ä¾¿åˆ©ï¼Œç­‰ç­‰æ¡ä»¶ã€‚è¿™ä¹Ÿæ˜¯ä¸ºä»€ä¹ˆåœ¨æ¯•ä¸šåŽæˆ‘åªèƒ½é€‰æ‹©åŽ»æ‰“å·¥è€Œä¸èƒ½é€‰æ‹©
创业的原因。
 4:建立在3的基础上,如果éžå¸¸çš„ä¸å¹¸ï¼Œæˆ‘实现了我的梦想,剩下的时间就是回报
ç¤¾ä¼šï¼Œæˆ‘è¦æŠŠæˆ‘95%的财产æèµ å‡ºåŽ»ã€‚
 以上就是我的èŒä¸šè§„åˆ’ï¼Œåœ¨å†™ä¹‹å‰æˆ‘一直在想是自己写还是googleï¼Œæœ€ç»ˆå†³å®šè¿˜æ˜¯è‡ªå·±å†™ã€‚å·²ç»æ¯”è¾ƒæ™šäº†å¤´æ™•æ™•çš„ï¼Œæ„Ÿè§‰è¿˜æœ‰å¾ˆå¤šä¸œè¥¿æ²¡æœ‰å†™ï¼Œä½†æ˜¯åˆæƒ³ä¸åˆ°æ˜¯å“ªäº›ï¼Œç®—了,就åªèƒ½è¿™æ ·äº†ã€‚
       2008年10月4日 23:55

因为信任,所以简å•

essay No Comments »

æ·˜å®çš„æ¯•业生招è˜å·²ç»å¼€å§‹äº†ï¼Œå¾ˆå–œæ¬¢æ·˜å®UED上的一å¥è¯ï¼Œçœ‹äº†å¾ˆå¤šæ·˜å®ä¸Šçš„èŒä½å‘çŽ°å¾ˆå°‘æˆ–è€…è¯´åŸºæœ¬ä¸Šæ²¡æœ‰é€‚åˆæˆ‘的,看æ¥åŠªåŠ›è¦éœ€è¦ç»§ç»­ã€‚
 暑å‡é‡Œå¬äº†ä¸€äº›æ¯”è¾ƒå¥½çš„å¹¿æ’­å‰§ï¼Œå¦‚ã€Šè®©é’æ˜¥ç»§ç»­ã€‹ï¼Œã€Šå’Œç©ºå§åŒå±…的日å­ã€‹ï¼Œä¸€äº›æ ¡å›­çš„,社会的问题。在暑å‡çš„æ—¶å€™ä¹Ÿåˆ¶å®šäº†ä¸€äº›è®¡åˆ’,看完《js高级程åºè®¾è®¡ã€‹ï¼Œç†Ÿæ‚‰Thinkphp,把英语4级过了。至少我è¦ä¿è¯æˆ‘能有在北京生活下去的能力。
Â å›žåˆ°å­¦æ ¡ç”Ÿæ´»ä¼¼ä¹Žå¹¶ä¸æ˜¯æˆ‘想象中的那样,一个BTçš„è€å¸ˆï¼Œå‡ ä¹Žæ¯èŠ‚è¯¾éƒ½ç‚¹å,让我ä¸å¾—ä¸åŽ»ä¸Šæ— èŠçš„课,上机的时候去学Linuxï¼ŒåŽ»äº†åªæ˜¯äº¤è¯•验报告和点å,关于Linux的一点都没有讲,真怀疑他知ä¸çŸ¥é“什么å«åšLinux,对于大学的教育,也就那样,我竟然会为这些ç¹ç的事情去打乱我原有的计划。昨天去了一家网络公å¸ï¼Œä¸Žå…¶å«åšç½‘络公å¸ï¼Œä¸å¦‚å«åšæŠ•æœºå…¬å¸ï¼Œå› ä¸ºä»–更本没有自己的ç†å¿µå’Œå…·ä½“çš„å…¬å¸æ–¹å‘,什么能赚钱就åšä»€ä¹ˆï¼Œæœ€è®©äººå¼„䏿˜Žç™½çš„就是竟然会花10多万去买一个群å‘çš„è¥é”€è½¯ä»¶ã€‚似乎在这3年中我在赣州接触的所谓的网络公å¸éƒ½è¿™æ ·ï¼Œæœ‰ä¸€ç‚¹å°é’±ï¼Œå°èµšå¤§é’±ï¼Œå´ä¸çŸ¥é“自己应该干什么。赣州的网络å‘展还ä¸å¤Ÿæˆç†Ÿã€‚
————————和åŒå­¦dota,晚上继续——————————————————
固定的这个时间,最近æ¯å¤©æ™šä¸Šå’ŒåŒå­¦çŽ©ä¸€ä¸ªRPG的这个游æˆï¼Œå¤§çº¦åˆ°10点多钟,有点堕è½çš„æ„Ÿè§‰ï¼Œç‰¹åˆ«æ˜¯åœ¨è¿™2天。今天晚上终于å‘现ä¸èƒ½å› ä¸ºå­¦æ ¡çš„æ— èŠæœ‰æ²¡æœ‰ç”¨çš„课程去烦æ¼ï¼Œåº”该开始计划。离求èŒçš„路还很长,并且很难走。明天醒æ¥åŽåˆæ˜¯æ–°çš„开始。

æœ¬æ¥æ˜¯æƒ³å†™å®Œäº†ä»¥åŽå‘到blog上,没有想到dh的空间竟然打ä¸å¼€ï¼Œæœ€è¿‘dhçš„é€Ÿåº¦æ˜Žæ˜¾æ¯”ä»¥å‰æ…¢äº†å¾ˆå¤šï¼Œè¿˜å¥½gd的还ä¸é”™ã€‚åªèƒ½æ˜Žå¤©æ—©ä¸Šè¯•试。

深入浅出之正则表达å¼ï¼ˆäºŒï¼‰

technology No Comments »

å‰è¨€ï¼š
       本文是å‰ä¸€ç‰‡æ–‡ç« ã€Šæ·±å…¥æµ…出之正则表达å¼ï¼ˆä¸€ï¼‰ã€‹çš„续篇,在本文中讲述了正则表达å¼ä¸­çš„组与å‘åŽå¼•用,先å‰å‘åŽæŸ¥çœ‹ï¼Œæ¡ä»¶æµ‹è¯•,å•è¯è¾¹ç•Œï¼Œé€‰æ‹©ç¬¦ç­‰è¡¨è¾¾å¼åŠä¾‹å­ï¼Œå¹¶åˆ†æžäº†æ­£åˆ™å¼•æ“Žåœ¨æ‰§è¡ŒåŒ¹é…æ—¶çš„内部机ç†ã€‚
       本文是Jan Goyvaerts为RegexBuddy写的教程的译文,版æƒå½’原作者所有,欢迎转载。但是为了尊é‡åŽŸä½œè€…å’Œè¯‘è€…çš„åŠ³åŠ¨ï¼Œè¯·æ³¨æ˜Žå‡ºå¤„ï¼è°¢è°¢ï¼

 

9.      å•è¯è¾¹ç•Œ

元字符<<\b>>也是一ç§å¯¹ä½ç½®è¿›è¡ŒåŒ¹é…的“锚â€ã€‚è¿™ç§åŒ¹é…是0长度匹é…。

有4ç§ä½ç½®è¢«è®¤ä¸ºæ˜¯â€œå•è¯è¾¹ç•Œâ€ï¼š

1)        在字符串的第一个字符å‰çš„ä½ç½®(如果字符串的第一个字符是一个“å•è¯å­—符â€)

2)        在字符串的最åŽä¸€ä¸ªå­—符åŽçš„ä½ç½®(如果字符串的最åŽä¸€ä¸ªå­—符是一个“å•è¯å­—符â€)

3)        在一个“å•è¯å­—符â€å’Œâ€œéžå•è¯å­—符â€ä¹‹é—´ï¼Œå…¶ä¸­â€œéžå•è¯å­—符â€ç´§è·Ÿåœ¨â€œå•è¯å­—符â€ä¹‹åŽ

4)        在一个“éžå•è¯å­—符â€å’Œâ€œå•è¯å­—符â€ä¹‹é—´ï¼Œå…¶ä¸­â€œå•è¯å­—符â€ç´§è·Ÿåœ¨â€œéžå•è¯å­—符â€åŽé¢

 “å•è¯å­—ç¬¦â€æ˜¯å¯ä»¥ç”¨â€œ\wâ€åŒ¹é…的字符,“éžå•è¯å­—ç¬¦â€æ˜¯å¯ä»¥ç”¨â€œ\Wâ€åŒ¹é…的字符。在大多数的正则表达å¼å®žçŽ°ä¸­ï¼Œâ€œå•è¯å­—符â€é€šå¸¸åŒ…括<<[a-zA-Z0-9_]>>。

例如:<<\b4\b>>能够匹é…å•个的4è€Œä¸æ˜¯ä¸€ä¸ªæ›´å¤§æ•°çš„一部分。这个正则表达å¼ä¸ä¼šåŒ¹é…“44â€ä¸­çš„4。

æ¢ç§è¯´æ³•,几乎å¯ä»¥è¯´<<\b>>匹é…ä¸€ä¸ªâ€œå­—æ¯æ•°å­—åºåˆ—â€çš„开始和结æŸçš„ä½ç½®ã€‚

 

“å•è¯è¾¹ç•Œâ€çš„å–å集为<<\B>>,他è¦åŒ¹é…çš„ä½ç½®æ˜¯ä¸¤ä¸ªâ€œå•è¯å­—符â€ä¹‹é—´æˆ–者两个“éžå•è¯å­—符â€ä¹‹é—´çš„ä½ç½®ã€‚

 

·        深入正则表达å¼å¼•擎内部

让我们看看把正则表达å¼<<\bis\b>>应用到字符串“This island is beautifulâ€ã€‚引擎先处ç†ç¬¦å·<<\b>>。因为\b是0长度 ,所以第一个字符Tå‰é¢çš„ä½ç½®ä¼šè¢«è€ƒå¯Ÿã€‚因为T是一个“å•è¯å­—符â€ï¼Œè€Œå®ƒå‰é¢çš„字符是一个空字符(void),所以\b匹é…了å•è¯è¾¹ç•Œã€‚接ç€<<i>>和第一个字符“Tâ€åŒ¹é…失败。匹é…过程继续进行,直到第五个空格符,和第四个字符“sâ€ä¹‹é—´åˆåŒ¹é…了<<\b>>。然而空格符和<<i>>ä¸åŒ¹é…。继续å‘åŽï¼Œåˆ°äº†ç¬¬å…­ä¸ªå­—符“iâ€ï¼Œå’Œç¬¬äº”个空格字符之间匹é…了<<\b>>,然åŽ<<is>>和第六ã€ç¬¬ä¸ƒä¸ªå­—符都匹é…了。然而第八个字符和第二个“å•è¯è¾¹ç•Œâ€ä¸åŒ¹é…,所以匹é…åˆå¤±è´¥äº†ã€‚到了第13个字符i,因为和å‰é¢ä¸€ä¸ªç©ºæ ¼ç¬¦å½¢æˆâ€œå•è¯è¾¹ç•Œâ€ï¼ŒåŒæ—¶<<is>>和“isâ€åŒ¹é…。引擎接ç€å°è¯•匹é…第二个<<\b>>。因为第15个空格符和“sâ€å½¢æˆå•è¯è¾¹ç•Œï¼Œæ‰€ä»¥åŒ¹é…æˆåŠŸã€‚å¼•æ“Žâ€œæ€¥ç€â€è¿”回æˆåŠŸåŒ¹é…的结果。

 

10.  选择符

正则表达å¼ä¸­â€œ|â€è¡¨ç¤ºé€‰æ‹©ã€‚ä½ å¯ä»¥ç”¨é€‰æ‹©ç¬¦åŒ¹é…多个å¯èƒ½çš„æ­£åˆ™è¡¨è¾¾å¼ä¸­çš„一个。

如果你想æœç´¢æ–‡å­—“catâ€æˆ–“dogâ€ï¼Œä½ å¯ä»¥ç”¨<<cat|dog>>。如果你想有更多的选择,你åªè¦æ‰©å±•列表<<cat|dog|mouse|fish>>。

选择符在正则表达å¼ä¸­å…·æœ‰æœ€ä½Žçš„优先级,也就是说,它告诉引擎è¦ä¹ˆåŒ¹é…选择符左边的所有表达å¼ï¼Œè¦ä¹ˆåŒ¹é…å³è¾¹çš„æ‰€æœ‰è¡¨è¾¾å¼ã€‚你也å¯ä»¥ç”¨åœ†æ‹¬å·æ¥é™åˆ¶é€‰æ‹©ç¬¦çš„作用范围。如<<\b(cat|dog)\b>>,这样告诉正则引擎把(cat|dog)当æˆä¸€ä¸ªæ­£åˆ™è¡¨è¾¾å¼å•使¥å¤„ç†ã€‚

·        æ³¨æ„æ­£åˆ™å¼•æ“Žçš„â€œæ€¥äºŽè¡¨åŠŸâ€æ€§

æ­£åˆ™å¼•æ“Žæ˜¯æ€¥åˆ‡çš„ï¼Œå½“å®ƒæ‰¾åˆ°ä¸€ä¸ªæœ‰æ•ˆçš„åŒ¹é…æ—¶ï¼Œå®ƒä¼šåœæ­¢æœç´¢ã€‚因此在一定æ¡ä»¶ä¸‹ï¼Œé€‰æ‹©ç¬¦ä¸¤è¾¹çš„表达å¼çš„顺åºå¯¹ç»“果会有影å“。å‡è®¾ä½ æƒ³ç”¨æ­£åˆ™è¡¨è¾¾å¼æœç´¢ä¸€ä¸ªç¼–程语言的函数列表:Get,GetValue,Set或SetValue。一个明显的解决方案是<<Get|GetValue|Set|SetValue>>。让我们看看当æœç´¢SetValue时的结果。

因为<<Get>>å’Œ<<GetValue>>都失败了,而<<Set>>åŒ¹é…æˆåŠŸã€‚å› ä¸ºæ­£åˆ™å¯¼å‘的引擎都是“急切â€çš„,所以它会返回第一个æˆåŠŸçš„åŒ¹é…,就是“Setâ€ï¼Œè€Œä¸åŽ»ç»§ç»­æœç´¢æ˜¯å¦æœ‰å…¶ä»–更好的匹é…。

和我们期望的相å,正则表达å¼å¹¶æ²¡æœ‰åŒ¹é…整个字符串。有几ç§å¯èƒ½çš„è§£å†³åŠžæ³•ã€‚ä¸€æ˜¯è€ƒè™‘åˆ°æ­£åˆ™å¼•æ“Žçš„â€œæ€¥åˆ‡â€æ€§ï¼Œæ”¹å˜é€‰é¡¹çš„顺åºï¼Œä¾‹å¦‚我们使用<<GetValue|Get|SetValue|Set>>,这样我们就å¯ä»¥ä¼˜å…ˆæœç´¢æœ€é•¿çš„匹é…。我们也å¯ä»¥æŠŠå››ä¸ªé€‰é¡¹ç»“åˆèµ·æ¥æˆä¸¤ä¸ªé€‰é¡¹ï¼š<<Get(Value)?|Set(Value)?>>。因为问å·é‡å¤ç¬¦æ˜¯è´ªå©ªçš„,所以SetValue总会在Set之å‰è¢«åŒ¹é…。

一个更好的方案是使用å•è¯è¾¹ç•Œï¼š<<\b(Get|GetValue|Set|SetValue)\b>>或<<\b(Get(Value)?|Set(Value)?\b>>。更进一步,既然所有的选择都有相åŒçš„结尾,我们å¯ä»¥æŠŠæ­£åˆ™è¡¨è¾¾å¼ä¼˜åŒ–为<<\b(Get|Set)(Value)?\b>>。

 

 

11.  组与å‘åŽå¼•用

把正则表达å¼çš„一部分放在圆括å·å†…,你å¯ä»¥å°†å®ƒä»¬å½¢æˆç»„。然åŽä½ å¯ä»¥å¯¹æ•´ä¸ªç»„使用一些正则æ“作,例如é‡å¤æ“作符。

è¦æ³¨æ„çš„æ˜¯ï¼Œåªæœ‰åœ†æ‹¬å·â€œ()â€æ‰èƒ½ç”¨äºŽå½¢æˆç»„。“[]â€ç”¨äºŽå®šä¹‰å­—符集。“{}â€ç”¨äºŽå®šä¹‰é‡å¤æ“作。

当用“()â€å®šä¹‰äº†ä¸€ä¸ªæ­£åˆ™è¡¨è¾¾å¼ç»„åŽï¼Œæ­£åˆ™å¼•擎则会把被匹é…的组按照顺åºç¼–å·ï¼Œå­˜å…¥ç¼“存。当对被匹é…的组进行å‘åŽå¼•用的时候,å¯ä»¥ç”¨â€œ\æ•°å­—â€çš„æ–¹å¼è¿›è¡Œå¼•用。<<\1>>引用第一个匹é…çš„åŽå‘引用组,<<\2>>引用第二个组,以此类推,<<\n>>引用第n个组。而<<\0>>则引用整个被匹é…çš„æ­£åˆ™è¡¨è¾¾å¼æœ¬èº«ã€‚我们看一个例å­ã€‚

å‡è®¾ä½ æƒ³åŒ¹é…一个HTMLæ ‡ç­¾çš„å¼€å§‹æ ‡ç­¾å’Œç»“æŸæ ‡ç­¾ï¼Œä»¥åŠæ ‡ç­¾ä¸­é—´çš„æ–‡æœ¬ã€‚比如<B>This is a test</B>,我们è¦åŒ¹é…<B>å’Œ</B>以åŠä¸­é—´çš„æ–‡å­—。我们å¯ä»¥ç”¨å¦‚下正则表达å¼ï¼šâ€œ<([A-Z][A-Z0-9]*)[^>]*>.*?</\1>â€

首先,“<â€å°†ä¼šåŒ¹é…“<B>â€çš„第一个字符“<â€ã€‚ç„¶åŽ[A-Z]匹é…B,[A-Z0-9]*将会匹é…0åˆ°å¤šæ¬¡å­—æ¯æ•°å­—,åŽé¢ç´§æŽ¥ç€0到多个éžâ€œ>â€çš„å­—ç¬¦ã€‚æœ€åŽæ­£åˆ™è¡¨è¾¾å¼çš„“>â€å°†ä¼šåŒ¹é…“<B>â€çš„“>â€ã€‚æŽ¥ä¸‹æ¥æ­£åˆ™å¼•æ“Žå°†å¯¹ç»“æŸæ ‡ç­¾ä¹‹å‰çš„字符进行惰性匹é…,直到é‡åˆ°ä¸€ä¸ªâ€œ</â€ç¬¦å·ã€‚ç„¶åŽæ­£åˆ™è¡¨è¾¾å¼ä¸­çš„“\1â€è¡¨ç¤ºå¯¹å‰é¢åŒ¹é…的组“([A-Z][A-Z0-9]*)â€è¿›è¡Œå¼•用,在本例中,被引用的是标签å“Bâ€ã€‚所以需è¦è¢«åŒ¹é…的结尾标签为“</B>â€

ä½ å¯ä»¥å¯¹ç›¸åŒçš„åŽå‘引用组进行多次引用,<<([a-c])x\1x\1>>将匹é…“axaxaâ€ã€â€œbxbxbâ€ä»¥åŠâ€œcxcxcâ€ã€‚如果用数字形å¼å¼•用的组没有有效的匹é…,则引用到的内容简å•的为空。

一个åŽå‘引用ä¸èƒ½ç”¨äºŽå®ƒè‡ªèº«ã€‚<<([abc]\1)>>是错误的。因此你ä¸èƒ½å°†<<\0>>用于一个正则表达å¼åŒ¹é…本身,它åªèƒ½ç”¨äºŽæ›¿æ¢æ“作中。

åŽå‘引用ä¸èƒ½ç”¨äºŽå­—符集内部。<<(a)[\1b]>>中的<<\1>>å¹¶ä¸è¡¨ç¤ºåŽå‘引用。在字符集内部,<<\1>>å¯ä»¥è¢«è§£é‡Šä¸ºå…«è¿›åˆ¶å½¢å¼çš„转ç ã€‚

å‘åŽå¼•用会é™ä½Žå¼•擎的速度,因为它需è¦å­˜å‚¨åŒ¹é…的组。如果你ä¸éœ€è¦å‘åŽå¼•用,你å¯ä»¥å‘Šè¯‰å¼•擎对æŸä¸ªç»„ä¸å­˜å‚¨ã€‚例如:<<Get(?:Value)>>。其中“(â€åŽé¢ç´§è·Ÿçš„“?:â€ä¼šå‘Šè¯‰å¼•擎对于组(Value),ä¸å­˜å‚¨åŒ¹é…的值以供åŽå‘引用。

·        é‡å¤æ“作与åŽå‘引用

当对组使用é‡å¤æ“作符时,缓存里åŽå‘å¼•ç”¨å†…å®¹ä¼šè¢«ä¸æ–­åˆ·æ–°ï¼Œåªä¿ç•™æœ€åŽåŒ¹é…的内容。例如:<<([abc]+)=\1>>将匹é…“cab=cabâ€ï¼Œä½†æ˜¯<<([abc])+=\1>>å´ä¸ä¼šã€‚因为([abc])第一次匹é…“câ€æ—¶ï¼Œâ€œ\1â€ä»£è¡¨â€œcâ€ï¼›ç„¶åŽ([abc])会继续匹é…“aâ€å’Œâ€œbâ€ã€‚最åŽâ€œ\1â€ä»£è¡¨â€œbâ€ï¼Œæ‰€ä»¥å®ƒä¼šåŒ¹é…“cab=bâ€ã€‚

应用:检查é‡å¤å•è¯å½“编辑文字时,很容易就会输入é‡å¤å•è¯ï¼Œä¾‹å¦‚“the theâ€ã€‚使用<<\b(\w+)\s+\1\b>>å¯ä»¥æ£€æµ‹åˆ°è¿™äº›é‡å¤å•è¯ã€‚è¦åˆ é™¤ç¬¬äºŒä¸ªå•è¯ï¼Œåªè¦ç®€å•的利用替æ¢åŠŸèƒ½æ›¿æ¢æŽ‰â€œ\1â€å°±å¯ä»¥äº†ã€‚

 

 

·        组的命å和引用

在PHP,Python中,å¯ä»¥ç”¨<<(?P<name>group)>>æ¥å¯¹ç»„进行命åã€‚åœ¨æœ¬ä¾‹ä¸­ï¼Œè¯æ³•?P<name>就是对组(group)进行了命å。其中name是你对组的起的å字。你å¯ä»¥ç”¨(?P=name)进行引用。

.NET的命å组

.NET framework也支æŒå‘½å组。ä¸å¹¸çš„æ˜¯ï¼Œå¾®è½¯çš„程åºå‘˜ä»¬å†³å®šå‘æ˜Žä»–ä»¬è‡ªå·±çš„è¯­æ³•ï¼Œè€Œä¸æ˜¯æ²¿ç”¨Perlã€Python的规则。目å‰ä¸ºæ­¢ï¼Œè¿˜æ²¡æœ‰ä»»ä½•其他的正则表达å¼å®žçŽ°æ”¯æŒå¾®è½¯å‘明的语法。

䏋颿˜¯.NET中的例å­ï¼š

(?<first>group)(?’second’group)

正如你所看到的,.NETæä¾›ä¸¤ç§è¯æ³•æ¥åˆ›å»ºå‘½å组:一是用尖括å·â€œ<>â€ï¼Œæˆ–者用å•引å·â€œâ€™â€™â€ã€‚尖括å·åœ¨å­—符串中使用更方便,å•引å·åœ¨ASP代ç ä¸­æ›´æœ‰ç”¨ï¼Œå› ä¸ºASP代ç ä¸­â€œ<>â€è¢«ç”¨ä½œHTML标签。

è¦å¼•用一个命å组,使用\k<name>或\k’name’.

当进行æœç´¢æ›¿æ¢æ—¶ï¼Œä½ å¯ä»¥ç”¨â€œ${name}â€æ¥å¼•用一个命å组。

 

12.  正则表达å¼çš„åŒ¹é…æ¨¡å¼

本教程所讨论的正则表达å¼å¼•擎都支æŒä¸‰ç§åŒ¹é…模å¼ï¼š

<</i>>使正则表达å¼å¯¹å¤§å°å†™ä¸æ•感,

<</s>>å¼€å¯â€œå•行模å¼â€ï¼Œå³ç‚¹å·â€œ.â€åŒ¹é…新行符

<</m>>å¼€å¯â€œå¤šè¡Œæ¨¡å¼â€ï¼Œå³â€œ^â€å’Œâ€œ$â€åŒ¹é…新行符的å‰é¢å’ŒåŽé¢çš„ä½ç½®ã€‚

 

·        在正则表达å¼å†…部打开或关闭模å¼

如果你在正则表达å¼å†…部æ’入修饰符(?ism),则该修饰符åªå¯¹å…¶å³è¾¹çš„æ­£åˆ™è¡¨è¾¾å¼èµ·ä½œç”¨ã€‚(?-i)是关闭大å°å†™ä¸æ•感。你å¯ä»¥å¾ˆå¿«çš„进行测试。<<(?i)te(?-i)st>>应该匹é…TEst,但是ä¸èƒ½åŒ¹é…teST或TEST.

 

13.  原å­ç»„与防止回溯

在一些特殊情况下,因为回溯会使得引擎的效率æžå…¶ä½Žä¸‹ã€‚

让我们看一个例å­ï¼šè¦åŒ¹é…这样的字串,字串中的æ¯ä¸ªå­—段间用逗å·åšåˆ†éš”符,第12个字段由P开头。

我们容易想到这样的正则表达å¼<<^(.*?,){11}P>>。这个正则表达å¼åœ¨æ­£å¸¸æƒ…况下工作的很好。但是在æžç«¯æƒ…况下,如果第12ä¸ªå­—æ®µä¸æ˜¯ç”±P开头,则会å‘生ç¾é𾿀§çš„å›žæº¯ã€‚å¦‚è¦æœç´¢çš„字串为“1,2,3,4,5,6,7,8,9,10,11,12,13â€ã€‚首先,正则表达å¼ä¸€ç›´æˆåŠŸåŒ¹é…直到第12个字符。这时,å‰é¢çš„æ­£åˆ™è¡¨è¾¾å¼æ¶ˆè€—的字串为“1,2,3,4,5,6,7,8,9,10,11,â€ï¼Œåˆ°äº†ä¸‹ä¸€ä¸ªå­—符,<<P>>å¹¶ä¸åŒ¹é…“12â€ã€‚æ‰€ä»¥å¼•æ“Žè¿›è¡Œå›žæº¯ï¼Œè¿™æ—¶æ­£åˆ™è¡¨è¾¾å¼æ¶ˆè€—的字串为“1,2,3,4,5,6,7,8,9,10,11â€ã€‚继续下一次匹é…过程,下一个正则符å·ä¸ºç‚¹å·<<.>>,å¯ä»¥åŒ¹é…下一个逗å·â€œ,â€ã€‚然而<<,>>å¹¶ä¸åŒ¹é…字符“12â€ä¸­çš„“1â€ã€‚匹é…失败,继续回溯。大家å¯ä»¥æƒ³è±¡ï¼Œè¿™æ ·çš„å›žæº¯ç»„åˆæ˜¯ä¸ªéžå¸¸å¤§çš„æ•°é‡ã€‚å› æ­¤å¯èƒ½ä¼šé€ æˆå¼•擎崩溃。

ç”¨äºŽé˜»æ­¢è¿™æ ·å·¨å¤§çš„å›žæº¯æœ‰å‡ ç§æ–¹æ¡ˆï¼š

一ç§ç®€å•的方案是尽å¯èƒ½çš„使匹é…精确。用å–å字符集代替点å·ã€‚例如我们用如下正则表达å¼<<^([^,\r\n]*,){11}P>>,这样å¯ä»¥ä½¿å¤±è´¥å›žæº¯çš„æ¬¡æ•°ä¸‹é™åˆ°11次。

å¦ä¸€ç§æ–¹æ¡ˆæ˜¯ä½¿ç”¨åŽŸå­ç»„。

原å­ç»„的目的是使正则引擎失败的更快一点。因此å¯ä»¥æœ‰æ•ˆçš„阻止海é‡å›žæº¯ã€‚原å­ç»„的语法是<<(?>正则表达å¼)>>。ä½äºŽ(?>)之间的所有正则表达å¼éƒ½ä¼šè¢«è®¤ä¸ºæ˜¯ä¸€ä¸ªå•一的正则符å·ã€‚一旦匹é…失败,引擎将会回溯到原å­ç»„å‰é¢çš„æ­£åˆ™è¡¨è¾¾å¼éƒ¨åˆ†ã€‚å‰é¢çš„例å­ç”¨åŽŸå­ç»„å¯ä»¥è¡¨è¾¾æˆ<<^(?>(.*?,){11})P>>。一旦第å二个字段匹é…失败,引擎回溯到原å­ç»„å‰é¢çš„<<^>>。

 

14.  å‘剿Ÿ¥çœ‹ä¸Žå‘åŽæŸ¥çœ‹

Perl 5 引入了两个强大的正则语法:“å‘剿Ÿ¥çœ‹â€å’Œâ€œå‘åŽæŸ¥çœ‹â€ã€‚他们也被称作“零长度断言â€ã€‚ä»–ä»¬å’Œé”šå®šä¸€æ ·éƒ½æ˜¯é›¶é•¿åº¦çš„ï¼ˆæ‰€è°“é›¶é•¿åº¦å³æŒ‡è¯¥æ­£åˆ™è¡¨è¾¾å¼ä¸æ¶ˆè€—被匹é…的字符串)。ä¸åŒä¹‹å¤„在于“å‰åŽæŸ¥çœ‹â€ä¼šå®žé™…匹é…å­—ç¬¦ï¼Œåªæ˜¯ä»–们会抛弃匹é…åªè¿”回匹é…ç»“æžœï¼šåŒ¹é…æˆ–ä¸åŒ¹é…。这就是为什么他们被称作“断言â€ã€‚他们并ä¸å®žé™…æ¶ˆè€—å­—ç¬¦ä¸²ä¸­çš„å­—ç¬¦ï¼Œè€Œåªæ˜¯æ–­è¨€ä¸€ä¸ªåŒ¹é…是å¦å¯èƒ½ã€‚

几乎本文讨论的所有正则表达å¼çš„实现都支æŒâ€œå‘å‰å‘åŽæŸ¥çœ‹â€ã€‚唯一的一个例外是Javascriptåªæ”¯æŒå‘剿Ÿ¥çœ‹ã€‚

·        肯定和å¦å®šå¼çš„å‘剿Ÿ¥çœ‹

如我们å‰é¢æè¿‡çš„一个例å­ï¼šè¦æŸ¥æ‰¾ä¸€ä¸ªq,åŽé¢æ²¡æœ‰ç´§è·Ÿä¸€ä¸ªu。也就是说,è¦ä¹ˆqåŽé¢æ²¡æœ‰å­—符,è¦ä¹ˆåŽé¢çš„å­—ç¬¦ä¸æ˜¯u。采用å¦å®šå¼å‘剿Ÿ¥çœ‹åŽçš„一个解决方案为<<q(?!u)>>。å¦å®šå¼å‘剿Ÿ¥çœ‹çš„语法是<<(?!查看的内容)>>。

肯定å¼å‘剿Ÿ¥çœ‹å’Œå¦å®šå¼å‘剿Ÿ¥çœ‹å¾ˆç±»ä¼¼ï¼š<<(?=查看的内容)>>。

如果在“查看的内容â€éƒ¨åˆ†æœ‰ç»„,也会产生一个å‘åŽå¼•用。但是å‘剿Ÿ¥çœ‹æœ¬èº«å¹¶ä¸ä¼šäº§ç”Ÿå‘åŽå¼•用,也ä¸ä¼šè¢«è®¡å…¥å‘åŽå¼•用的编å·ä¸­ã€‚这是因为å‘剿Ÿ¥çœ‹æœ¬èº«æ˜¯ä¼šè¢«æŠ›å¼ƒæŽ‰çš„,åªä¿ç•™åŒ¹é…与å¦çš„判断结果。如果你想ä¿ç•™åŒ¹é…的结果作为å‘åŽå¼•用,你å¯ä»¥ç”¨<<(?=(regex))>>æ¥äº§ç”Ÿä¸€ä¸ªå‘åŽå¼•用。

·        肯定和å¦å®šå¼çš„å…ˆåŽæŸ¥çœ‹

å‘åŽæŸ¥çœ‹å’Œå‘剿Ÿ¥çœ‹æœ‰ç›¸åŒçš„æ•ˆæžœï¼Œåªæ˜¯æ–¹å‘相å

å¦å®šå¼å‘åŽæŸ¥çœ‹çš„语法是:<<(?<!查看内容)>>

肯定å¼å‘åŽæŸ¥çœ‹çš„语法是:<<(?<=查看内容)>>

我们å¯ä»¥çœ‹åˆ°ï¼Œå’Œå‘剿Ÿ¥çœ‹ç›¸æ¯”,多了一个表示方å‘的左尖括å·ã€‚

例:<<(?<!a)b>>将会匹é…一个没有“aâ€ä½œå‰å¯¼å­—符的“bâ€ã€‚

值得注æ„的是:å‘剿Ÿ¥çœ‹ä»Žå½“å‰å­—符串ä½ç½®å¼€å§‹å¯¹â€œæŸ¥çœ‹â€æ­£åˆ™è¡¨è¾¾å¼è¿›è¡ŒåŒ¹é…ï¼›å‘åŽæŸ¥çœ‹åˆ™ä»Žå½“å‰å­—符串ä½ç½®å¼€å§‹å…ˆåŽå›žæº¯ä¸€ä¸ªå­—符,然åŽå†å¼€å§‹å¯¹â€œæŸ¥çœ‹â€æ­£åˆ™è¡¨è¾¾å¼è¿›è¡ŒåŒ¹é…。

 

·        深入正则表达å¼å¼•擎内部

让我们看一个简å•例å­ã€‚

把正则表达å¼<<q(?!u)>>应用到字符串“Iraqâ€ã€‚正则表达å¼çš„ç¬¬ä¸€ä¸ªç¬¦å·æ˜¯<<q>>。正如我们知é“的,引擎在匹é…<<q>>以å‰ä¼šæ‰«è¿‡æ•´ä¸ªå­—符串。当第四个字符“qâ€è¢«åŒ¹é…åŽï¼Œâ€œqâ€åŽé¢æ˜¯ç©ºå­—符(void)ã€‚è€Œä¸‹ä¸€ä¸ªæ­£åˆ™ç¬¦å·æ˜¯å‘剿Ÿ¥çœ‹ã€‚引擎注æ„到已ç»è¿›å…¥äº†ä¸€ä¸ªå‘剿Ÿ¥çœ‹æ­£åˆ™è¡¨è¾¾å¼éƒ¨åˆ†ã€‚ä¸‹ä¸€ä¸ªæ­£åˆ™ç¬¦å·æ˜¯<<u>>,和空字符ä¸åŒ¹é…,从而导致å‘剿Ÿ¥çœ‹é‡Œçš„æ­£åˆ™è¡¨è¾¾å¼åŒ¹é…失败。因为是一个å¦å®šå¼çš„å‘剿Ÿ¥çœ‹ï¼Œæ„å‘³ç€æ•´ä¸ªå‘剿Ÿ¥çœ‹ç»“果是æˆåŠŸçš„ã€‚äºŽæ˜¯åŒ¹é…结果“qâ€è¢«è¿”回了。

我们在把相åŒçš„æ­£åˆ™è¡¨è¾¾å¼åº”用到“quitâ€ã€‚<<q>>匹é…了“qâ€ã€‚ä¸‹ä¸€ä¸ªæ­£åˆ™ç¬¦å·æ˜¯å‘剿Ÿ¥çœ‹éƒ¨åˆ†çš„<<u>>,它匹é…了字符串中的第二个字符“iâ€ã€‚引擎继续走到下个字符“iâ€ã€‚然而引擎这时注æ„到å‘剿Ÿ¥çœ‹éƒ¨åˆ†å·²ç»å¤„ç†å®Œäº†ï¼Œå¹¶ä¸”å‘剿Ÿ¥çœ‹å·²ç»æˆåŠŸã€‚äºŽæ˜¯å¼•æ“ŽæŠ›å¼ƒè¢«åŒ¹é…的字符串部分,这将导致引擎回退到字符“uâ€ã€‚

因为å‘剿Ÿ¥çœ‹æ˜¯å¦å®šå¼çš„,æ„å‘³ç€æŸ¥çœ‹éƒ¨åˆ†çš„æˆåŠŸåŒ¹é…导致了整个å‘剿Ÿ¥çœ‹çš„失败,因此引擎ä¸å¾—ä¸è¿›è¡Œå›žæº¯ã€‚最åŽå› ä¸ºå†æ²¡æœ‰å…¶ä»–的“qâ€å’Œ<<q>>匹é…,所以整个匹é…失败了。

为了确ä¿ä½ èƒ½æ¸…楚地ç†è§£å‘剿Ÿ¥çœ‹çš„实现,让我们把<<q(?=u)i>>应用到“quitâ€ã€‚<<q>>首先匹é…“qâ€ã€‚ç„¶åŽå‘剿Ÿ¥çœ‹æˆåŠŸåŒ¹é…“uâ€ï¼ŒåŒ¹é…的部分被抛弃,åªè¿”回å¯ä»¥åŒ¹é…的判断结果。引擎从字符“iâ€å›žé€€åˆ°â€œuâ€ã€‚由于å‘剿Ÿ¥çœ‹æˆåŠŸäº†ï¼Œå¼•æ“Žç»§ç»­å¤„ç†ä¸‹ä¸€ä¸ªæ­£åˆ™ç¬¦å·<<i>>。结果å‘现<<i>>和“uâ€ä¸åŒ¹é…。因此匹é…失败了。由于åŽé¢æ²¡æœ‰å…¶ä»–的“qâ€ï¼Œæ•´ä¸ªæ­£åˆ™è¡¨è¾¾å¼çš„匹é…失败了。

 

·        更进一步ç†è§£æ­£åˆ™è¡¨è¾¾å¼å¼•擎内部机制

让我们把<<(?<=a)b>>应用到“thingamabobâ€ã€‚引擎开始处ç†å‘åŽæŸ¥çœ‹éƒ¨åˆ†çš„æ­£åˆ™ç¬¦å·å’Œå­—符串中的第一个字符。在这个例å­ä¸­ï¼Œå‘åŽæŸ¥çœ‹å‘Šè¯‰æ­£åˆ™è¡¨è¾¾å¼å¼•æ“Žå›žé€€ä¸€ä¸ªå­—ç¬¦ï¼Œç„¶åŽæŸ¥çœ‹æ˜¯å¦æœ‰ä¸€ä¸ªâ€œaâ€è¢«åŒ¹é…。因为在“tâ€å‰é¢æ²¡æœ‰å­—符,所以引擎ä¸èƒ½å›žé€€ã€‚å› æ­¤å‘åŽæŸ¥çœ‹å¤±è´¥äº†ã€‚引擎继续走到下一个字符“hâ€ã€‚å†ä¸€æ¬¡ï¼Œå¼•æ“Žæš‚æ—¶å›žé€€ä¸€ä¸ªå­—ç¬¦å¹¶æ£€æŸ¥æ˜¯å¦æœ‰ä¸ªâ€œaâ€è¢«åŒ¹é…。结果å‘现了一个“tâ€ã€‚å‘åŽæŸ¥çœ‹åˆå¤±è´¥äº†ã€‚

å‘åŽæŸ¥çœ‹ç»§ç»­å¤±è´¥ï¼Œç›´åˆ°æ­£åˆ™è¡¨è¾¾å¼åˆ°è¾¾äº†å­—符串中的“mâ€ï¼ŒäºŽæ˜¯è‚¯å®šå¼çš„å‘åŽæŸ¥çœ‹è¢«åŒ¹é…了。因为它是零长度的,字符串的当å‰ä½ç½®ä»ç„¶æ˜¯â€œmâ€ã€‚ä¸‹ä¸€ä¸ªæ­£åˆ™ç¬¦å·æ˜¯<<b>>,和“mâ€åŒ¹é…失败。下一个字符是字符串中的第二个“aâ€ã€‚引擎å‘åŽæš‚æ—¶å›žé€€ä¸€ä¸ªå­—符,并且å‘现<<a>>ä¸åŒ¹é…“mâ€ã€‚

在下一个字符是字符串中的第一个“bâ€ã€‚引擎暂时性的å‘åŽé€€ä¸€ä¸ªå­—符å‘现å‘åŽæŸ¥çœ‹è¢«æ»¡è¶³äº†ï¼ŒåŒæ—¶<<b>>匹é…了“bâ€ã€‚因此整个正则表达å¼è¢«åŒ¹é…了。作为结果,正则表达å¼è¿”回字符串中的第一个“bâ€ã€‚

·        å‘å‰å‘åŽæŸ¥çœ‹çš„应用

我们æ¥çœ‹è¿™æ ·ä¸€ä¸ªä¾‹å­ï¼šæŸ¥æ‰¾ä¸€ä¸ªå…·æœ‰6ä½å­—ç¬¦çš„ï¼Œå«æœ‰â€œcatâ€çš„å•è¯ã€‚

首先,我们å¯ä»¥ä¸ç”¨å‘å‰å‘åŽæŸ¥çœ‹æ¥è§£å†³é—®é¢˜ï¼Œä¾‹å¦‚:

<< cat\w{3}|\wcat\w{2}|\w{2}cat\w|\w{3}cat>>

足够简å•å§ï¼ä½†æ˜¯å½“éœ€æ±‚å˜æˆæŸ¥æ‰¾ä¸€ä¸ªå…·æœ‰6-12ä½å­—ç¬¦ï¼Œå«æœ‰â€œcatâ€ï¼Œâ€œdogâ€æˆ–“mouseâ€çš„å•è¯æ—¶ï¼Œè¿™ç§æ–¹æ³•å°±å˜å¾—有些笨拙了。

我们æ¥çœ‹çœ‹ä½¿ç”¨å‘剿Ÿ¥çœ‹çš„æ–¹æ¡ˆã€‚在这个例å­ä¸­ï¼Œæˆ‘ä»¬æœ‰ä¸¤ä¸ªåŸºæœ¬éœ€æ±‚è¦æ»¡è¶³ï¼šä¸€æ˜¯æˆ‘们需è¦ä¸€ä¸ª6ä½çš„字符,二是å•è¯å«æœ‰â€œcatâ€ã€‚

满足第一个需求的正则表达å¼ä¸º<<\b\w{6}\b>>。满足第二个需求的正则表达å¼ä¸º<<\b\w*cat\w*\b>>。

把两者结åˆèµ·æ¥ï¼Œæˆ‘们å¯ä»¥å¾—到如下的正则表达å¼ï¼š

     <<(?=\b\w{6}\b)\b\w*cat\w*\b>>

具体的匹é…è¿‡ç¨‹ç•™ç»™è¯»è€…ã€‚ä½†æ˜¯è¦æ³¨æ„的一点是,å‘剿Ÿ¥çœ‹æ˜¯ä¸æ¶ˆè€—字符的,因此当判断å•è¯æ»¡è¶³å…·æœ‰6个字符的æ¡ä»¶åŽï¼Œå¼•擎会从开始判断å‰çš„ä½ç½®ç»§ç»­å¯¹åŽé¢çš„æ­£åˆ™è¡¨è¾¾å¼è¿›è¡ŒåŒ¹é…。

最åŽä½œäº›ä¼˜åŒ–,å¯ä»¥å¾—到下é¢çš„æ­£åˆ™è¡¨è¾¾å¼ï¼š

<<\b(?=\w{6}\b)\w{0,3}cat\w*>>

 

15.  正则表达å¼ä¸­çš„æ¡ä»¶æµ‹è¯•

æ¡ä»¶æµ‹è¯•的语法为<<(?ifthen|else)>>。“ifâ€éƒ¨åˆ†å¯ä»¥æ˜¯å‘å‰å‘åŽæŸ¥çœ‹è¡¨è¾¾å¼ã€‚如果用å‘剿Ÿ¥çœ‹ï¼Œåˆ™è¯­æ³•å˜ä¸ºï¼š<<(?(?=regex)then|else)>>,其中else部分是å¯é€‰çš„。

如果if部分为true,则正则引擎会试图匹é…then部分,å¦åˆ™å¼•擎会试图匹é…else部分。

需è¦è®°ä½çš„æ˜¯ï¼Œå‘å‰å…ˆåŽæŸ¥çœ‹å¹¶ä¸å®žé™…消耗任何字符,因此åŽé¢çš„then与elseéƒ¨åˆ†çš„åŒ¹é…æ—¶ä»Žif测试å‰çš„部分开始进行å°è¯•。

 

16.  ä¸ºæ­£åˆ™è¡¨è¾¾å¼æ·»åŠ æ³¨é‡Š

在正则表达å¼ä¸­æ·»åŠ æ³¨é‡Šçš„è¯­æ³•æ˜¯ï¼š<<(?#comment)>>

ä¾‹ï¼šä¸ºç”¨äºŽåŒ¹é…æœ‰æ•ˆæ—¥æœŸçš„æ­£åˆ™è¡¨è¾¾å¼æ·»åŠ æ³¨é‡Šï¼š

 (?#year)(19|20)\d\d[- /.](?#month)(0[1-9]|1[012])[- /.](?#day)(0[1-9]|[12][0-9]|3[01])

深入浅出之正则表达å¼ï¼ˆä¸€ï¼‰

technology No Comments »


 


å‰è¨€ï¼š

       åŠå¹´å‰æˆ‘对正则表达å¼äº§ç”Ÿäº†å…´è¶£ï¼Œåœ¨ç½‘上查找过ä¸å°‘资料,看过ä¸å°‘的教程,最åŽåœ¨ä½¿ç”¨ä¸€ä¸ªæ­£åˆ™è¡¨è¾¾å¼å·¥å…·RegexBuddyæ—¶å‘现他的教程写的éžå¸¸å¥½ï¼Œå¯ä»¥è¯´æ˜¯æˆ‘ç›®å‰è§è¿‡æœ€å¥½çš„æ­£åˆ™è¡¨è¾¾å¼æ•™ç¨‹ã€‚于是一直想把他翻译过æ¥ã€‚è¿™ä¸ªæ„¿æœ›ç›´åˆ°è¿™ä¸ªäº”ä¸€é•¿å‡æ‰å¾—以实现,结果就有了这篇文章。关于本文的å字,使用“深入浅出â€ä¼¼ä¹Žå·²ç»å¤ªä¿—。但是通读原文以åŽï¼Œè§‰å¾—åªæœ‰ç”¨â€œæ·±å…¥æµ…å‡ºâ€æ‰èƒ½å‡†ç¡®çš„表达出该教程给我的感å—,所以也就ä¸èƒ½å…俗了。
       本文是Jan Goyvaerts为RegexBuddy写的教程的译文,版æƒå½’原作者所有,欢迎转载。但是为了尊é‡åŽŸä½œè€…å’Œè¯‘è€…çš„åŠ³åŠ¨ï¼Œè¯·æ³¨æ˜Žå‡ºå¤„ï¼è°¢è°¢ï¼

 

1.      什么是正则表达å¼

基本说æ¥ï¼Œæ­£åˆ™è¡¨è¾¾å¼æ˜¯ä¸€ç§ç”¨æ¥æè¿°ä¸€å®šæ•°é‡æ–‡æœ¬çš„æ¨¡å¼ã€‚Regex代表Regular Express。本文将用<<regex>>æ¥è¡¨ç¤ºä¸€æ®µå…·ä½“的正则表达å¼ã€‚

一段文本就是最基本的模å¼ï¼Œç®€å•的匹é…相åŒçš„æ–‡æœ¬ã€‚

 

2.      ä¸åŒçš„æ­£åˆ™è¡¨è¾¾å¼å¼•擎

正则表达å¼å¼•擎是一ç§å¯ä»¥å¤„ç†æ­£åˆ™è¡¨è¾¾å¼çš„软件。通常,引擎是更大的应用程åºçš„一部分。在软件世界,ä¸åŒçš„æ­£åˆ™è¡¨è¾¾å¼å¹¶ä¸äº’相兼容。本教程会集中讨论Perl 5 类型的引擎,因为这ç§å¼•æ“Žæ˜¯åº”ç”¨æœ€å¹¿æ³›çš„å¼•æ“Žã€‚åŒæ—¶æˆ‘们也会æåˆ°ä¸€äº›å’Œå…¶ä»–引擎的区别。许多近代的引擎都很类似,但ä¸å®Œå…¨ä¸€æ ·ã€‚例如.NET正则库,JDK正则包。

 

3.      文字符å·

最基本的正则表达å¼ç”±å•个文字符å·ç»„æˆã€‚如<<a>>,它将匹é…字符串中第一次出现的字符“aâ€ã€‚如对字符串“Jack is a boyâ€ã€‚“Jâ€åŽçš„“aâ€å°†è¢«åŒ¹é…。而第二个“aâ€å°†ä¸ä¼šè¢«åŒ¹é…。

正则表达å¼ä¹Ÿå¯ä»¥åŒ¹é…第二个“aâ€ï¼Œè¿™å¿…须是你告诉正则表达å¼å¼•擎从第一次匹é…的地方开始æœç´¢ã€‚在文本编辑器中,你å¯ä»¥ä½¿ç”¨â€œæŸ¥æ‰¾ä¸‹ä¸€ä¸ªâ€ã€‚在编程语言中,会有一个函数å¯ä»¥ä½¿ä½ ä»Žå‰ä¸€æ¬¡åŒ¹é…çš„ä½ç½®å¼€å§‹ç»§ç»­å‘åŽæœç´¢ã€‚

类似的,<<cat>>会匹é…“About cats and dogsâ€ä¸­çš„“catâ€ã€‚这等于是告诉正则表达å¼å¼•擎,找到一个<<c>>,紧跟一个<<a>>,å†è·Ÿä¸€ä¸ª<<t>>。

è¦æ³¨æ„,正则表达å¼å¼•æ“Žç¼ºçœæ˜¯å¤§å°å†™æ•感的。除éžä½ å‘Šè¯‰å¼•擎忽略大å°å†™ï¼Œå¦åˆ™<<cat>>ä¸ä¼šåŒ¹é…“Catâ€ã€‚

 

·        特殊字符

对于文字字符,有11个字符被ä¿ç•™ä½œç‰¹æ®Šç”¨é€”。他们是:

[ ] \ ^ $ . | ? * + ( )

这些特殊字符也被称作元字符。

如果你想在正则表达å¼ä¸­å°†è¿™äº›å­—符用作文本字符,你需è¦ç”¨åæ–œæ â€œ\â€å¯¹å…¶è¿›è¡Œæ¢ç  (escape)。例如你想匹é…“1+1=2â€ï¼Œæ­£ç¡®çš„表达å¼ä¸º<<1\+1=2>>.

éœ€è¦æ³¨æ„的是,<<1+1=2>>也是有效的正则表达å¼ã€‚但它ä¸ä¼šåŒ¹é…“1+1=2â€ï¼Œè€Œä¼šåŒ¹é…“123+111=234â€ä¸­çš„“111=2â€ã€‚因为“+â€åœ¨è¿™é‡Œè¡¨ç¤ºç‰¹æ®Šå«ä¹‰ï¼ˆé‡å¤1次到多次)。

åœ¨ç¼–ç¨‹è¯­è¨€ä¸­ï¼Œè¦æ³¨æ„,一些特殊的字符会先被编译器处ç†ï¼Œç„¶åŽå†ä¼ é€’给正则引擎。因此正则表达å¼<<1\+2=2>>在C++中è¦å†™æˆâ€œ1\\+1=2â€ã€‚为了匹é…“C:\tempâ€ï¼Œä½ è¦ç”¨æ­£åˆ™è¡¨è¾¾å¼<<C:\\temp>>。而在C++中,正则表达å¼åˆ™å˜æˆäº†â€œC:\\\\tempâ€ã€‚

 

·        ä¸å¯æ˜¾ç¤ºå­—符

å¯ä»¥ä½¿ç”¨ç‰¹æ®Šå­—符åºåˆ—æ¥ä»£è¡¨æŸäº›ä¸å¯æ˜¾ç¤ºå­—符:

<<\t>>代表Tab(0×09)

<<\r>>代表回车符(0×0D)

<<\n>>代表æ¢è¡Œç¬¦(0×0A)

è¦æ³¨æ„的是Windows中文本文件使用“\r\nâ€æ¥ç»“æŸä¸€è¡Œè€ŒUnix使用“\nâ€ã€‚

 

4.      正则表达å¼å¼•擎的内部工作机制

çŸ¥é“æ­£åˆ™è¡¨è¾¾å¼å¼•擎是如何工作的有助于你很快ç†è§£ä¸ºä½•æŸä¸ªæ­£åˆ™è¡¨è¾¾å¼ä¸åƒä½ æœŸæœ›çš„那样工作。

有两ç§ç±»åž‹çš„引擎:文本导å‘(text-directed)的引擎和正则导å‘(regex-directed)的引擎。Jeffrey Friedl把他们称作DFAå’ŒNFA引擎。本文谈到的是正则导å‘的引擎。这是因为一些éžå¸¸æœ‰ç”¨çš„特性,如“惰性â€é‡è¯(lazy quantifiers)å’Œåå‘引用(backreferences),åªèƒ½åœ¨æ­£åˆ™å¯¼å‘çš„å¼•æ“Žä¸­å®žçŽ°ã€‚æ‰€ä»¥æ¯«ä¸æ„外这ç§å¼•æ“Žæ˜¯ç›®å‰æœ€æµè¡Œçš„引擎。

ä½ å¯ä»¥è½»æ˜“分辨出所使用的引擎是文本导å‘还是正则导å‘。如果åå‘引用或“惰性â€é‡è¯è¢«å®žçŽ°ï¼Œåˆ™å¯ä»¥è‚¯å®šä½ ä½¿ç”¨çš„引擎是正则导å‘的。你å¯ä»¥ä½œå¦‚下测试:将正则表达å¼<<regex|regex not>>应用到字符串“regex notâ€ã€‚如果匹é…的结果是regex,则引擎是正则导å‘的。如果结果是regex not,则是文本导å‘的。因为正则导å‘的引擎是“猴急â€çš„ï¼Œå®ƒä¼šå¾ˆæ€¥åˆ‡çš„è¿›è¡Œè¡¨åŠŸï¼ŒæŠ¥å‘Šå®ƒæ‰¾åˆ°çš„ç¬¬ä¸€ä¸ªåŒ¹é… ã€‚

 

·        正则导å‘的引擎总是返回最左边的匹é…

这是需è¦ä½ ç†è§£çš„很é‡è¦çš„一点:å³ä½¿ä»¥åŽæœ‰å¯èƒ½å‘现一个“更好â€çš„匹é…,正则导å‘的引擎也总是返回最左边的匹é…。

当把<<cat>>应用到“He captured a catfish for his catâ€ï¼Œå¼•擎先比较<<c>>和“Hâ€ï¼Œç»“æžœå¤±è´¥äº†ã€‚äºŽæ˜¯å¼•æ“Žå†æ¯”较<<c>>和“eâ€ï¼Œä¹Ÿå¤±è´¥äº†ã€‚直到第四个字符,<<c>>匹é…了“câ€ã€‚<<a>>匹é…了第五个字符。到第六个字符<<t>>没能匹é…“pâ€ï¼Œä¹Ÿå¤±è´¥äº†ã€‚引擎å†ç»§ç»­ä»Žç¬¬äº”ä¸ªå­—ç¬¦é‡æ–°æ£€æŸ¥åŒ¹é…性。直到第å五个字符开始,<<cat>>匹é…上了“catfishâ€ä¸­çš„“catâ€ï¼Œæ­£åˆ™è¡¨è¾¾å¼å¼•擎急切的返回第一个匹é…的结果,而ä¸ä¼šå†ç»§ç»­æŸ¥æ‰¾æ˜¯å¦æœ‰å…¶ä»–更好的匹é…。

 

 

5.      字符集

字符集是由一对方括å·â€œ[]â€æ‹¬èµ·æ¥çš„字符集åˆã€‚使用字符集,你å¯ä»¥å‘Šè¯‰æ­£åˆ™è¡¨è¾¾å¼å¼•擎仅仅匹é…多个字符中的一个。如果你想匹é…一个“aâ€æˆ–一个“eâ€ï¼Œä½¿ç”¨<<[ae]>>。你å¯ä»¥ä½¿ç”¨<<gr[ae]y>>匹é…gray或grey。这在你ä¸ç¡®å®šä½ è¦æœç´¢çš„字符是采用美国英语还是英国英语时特别有用。相å,<<gr[ae]y>>å°†ä¸ä¼šåŒ¹é…graay或graey。字符集中的字符顺åºå¹¶æ²¡æœ‰ä»€ä¹ˆå…³ç³»ï¼Œç»“果都是相åŒçš„。

ä½ å¯ä»¥ä½¿ç”¨è¿žå­—符“-â€å®šä¹‰ä¸€ä¸ªå­—符范围作为字符集。<<[0-9]>>匹é…0到9之间的å•个数字。你å¯ä»¥ä½¿ç”¨ä¸æ­¢ä¸€ä¸ªèŒƒå›´ã€‚<<[0-9a-fA-F] >>匹é…å•个的å六进制数字,并且大å°å†™ä¸æ•感。你也å¯ä»¥ç»“åˆèŒƒå›´å®šä¹‰ä¸Žå•个字符定义。<<[0-9a-fxA-FX]>>匹é…一个å六进制数字或字æ¯Xã€‚å†æ¬¡å¼ºè°ƒä¸€ä¸‹ï¼Œå­—符和范围定义的先åŽé¡ºåºå¯¹ç»“果没有影å“。

 

·        字符集的一些应用

查找一个å¯èƒ½æœ‰æ‹¼å†™é”™è¯¯çš„å•è¯ï¼Œæ¯”如<<sep[ae]r[ae]te>> 或 <<li[cs]en[cs]e>>。

查找程åºè¯­è¨€çš„æ ‡è¯†ç¬¦ï¼Œ<<A-Za-z_][A-Za-z_0-9]*>>。(*表示é‡å¤0或多次)

查找C风格的å六进制数<<0[xX][A-Fa-f0-9]+>>。(+表示é‡å¤ä¸€æ¬¡æˆ–多次)

 

·        å–å字符集

在左方括å·â€œ[â€åŽé¢ç´§è·Ÿä¸€ä¸ªå°–括å·â€œ^â€ï¼Œå°†ä¼šå¯¹å­—符集å–å。结果是字符集将匹é…任何ä¸åœ¨æ–¹æ‹¬å·ä¸­çš„字符。ä¸åƒâ€œ.â€ï¼Œå–å字符集是å¯ä»¥åŒ¹é…回车æ¢è¡Œç¬¦çš„。

需è¦è®°ä½çš„很é‡è¦çš„一点是,å–å字符集必须è¦åŒ¹é…一个字符。<<q[^u]>>并䏿„味ç€ï¼šåŒ¹é…一个q,åŽé¢æ²¡æœ‰uè·Ÿç€ã€‚它æ„味ç€ï¼šåŒ¹é…一个q,åŽé¢è·Ÿç€ä¸€ä¸ªä¸æ˜¯u的字符。所以它ä¸ä¼šåŒ¹é…“Iraqâ€ä¸­çš„q,而会匹é…“Iraq is a countryâ€ä¸­çš„q和一个空格符。事实上,空格符是匹é…ä¸­çš„ä¸€éƒ¨åˆ†ï¼Œå› ä¸ºå®ƒæ˜¯ä¸€ä¸ªâ€œä¸æ˜¯u的字符â€ã€‚

å¦‚æžœä½ åªæƒ³åŒ¹é…一个q,æ¡ä»¶æ˜¯qåŽé¢æœ‰ä¸€ä¸ªä¸æ˜¯u的字符,我们å¯ä»¥ç”¨åŽé¢å°†è®²åˆ°çš„å‘剿Ÿ¥çœ‹æ¥è§£å†³ã€‚

 

·        字符集中的元字符

éœ€è¦æ³¨æ„çš„æ˜¯ï¼Œåœ¨å­—ç¬¦é›†ä¸­åªæœ‰4个 字符具有特殊å«ä¹‰ã€‚它们是:“] \ ^ -â€ã€‚“]â€ä»£è¡¨å­—符集定义的结æŸï¼›â€œ\â€ä»£è¡¨è½¬ä¹‰ï¼›â€œ^â€ä»£è¡¨å–å;“-â€ä»£è¡¨èŒƒå›´å®šä¹‰ã€‚其他常è§çš„元字符在字符集定义内部都是正常字符,ä¸éœ€è¦è½¬ä¹‰ã€‚ä¾‹å¦‚ï¼Œè¦æœç´¢æ˜Ÿå·*或加å·+,你å¯ä»¥ç”¨<<[+*]>>。当然,如果你对那些通常的元字符进行转义,你的正则表达å¼ä¸€æ ·ä¼šå·¥ä½œå¾—很好,但是这会é™ä½Žå¯è¯»æ€§ã€‚

åœ¨å­—ç¬¦é›†å®šä¹‰ä¸­ä¸ºäº†å°†åæ–œæ â€œ\â€ä½œä¸ºä¸€ä¸ªæ–‡å­—字符而éžç‰¹æ®Šå«ä¹‰çš„字符,你需è¦ç”¨å¦ä¸€ä¸ªåæ–œæ å¯¹å®ƒè¿›è¡Œè½¬ä¹‰ã€‚<<[\\x]>>将会匹é…ä¸€ä¸ªåæ–œæ å’Œä¸€ä¸ªX。“]^-â€éƒ½å¯ä»¥ç”¨åæ–œæ è¿›è¡Œè½¬ä¹‰ï¼Œæˆ–者将他们放在一个ä¸å¯èƒ½ä½¿ç”¨åˆ°ä»–们特殊å«ä¹‰çš„ä½ç½®ã€‚我们推èåŽè€…,因为这样å¯ä»¥å¢žåŠ å¯è¯»æ€§ã€‚比如对于字符“^â€ï¼Œå°†å®ƒæ”¾åœ¨é™¤äº†å·¦æ‹¬å·â€œ[â€åŽé¢çš„ä½ç½®ï¼Œä½¿ç”¨çš„都是文字字符å«ä¹‰è€Œéžå–åå«ä¹‰ã€‚如<<[x^]>>会匹é…一个x或^。<<[]x]>>会匹é…一个“]â€æˆ–“xâ€ã€‚<<[-x]>>或<<[x-]>>都会匹é…一个“-â€æˆ–“xâ€ã€‚

 

·        字符集的简写

因为一些字符集éžå¸¸å¸¸ç”¨ï¼Œæ‰€ä»¥æœ‰ä¸€äº›ç®€å†™æ–¹å¼ã€‚

<<\d>>代表<<[0-9]>>;

<<\w>>代表å•è¯å­—ç¬¦ã€‚è¿™ä¸ªæ˜¯éšæ­£åˆ™è¡¨è¾¾å¼å®žçŽ°çš„ä¸åŒè€Œæœ‰äº›å·®å¼‚。ç»å¤§å¤šæ•°çš„æ­£åˆ™è¡¨è¾¾å¼å®žçŽ°çš„å•è¯å­—符集都包å«äº†<<A-Za-z0-9_]>>。

<<\s>>代表“白字符â€ã€‚这个也是和ä¸åŒçš„实现有关的。在ç»å¤§å¤šæ•°çš„实现中,都包å«äº†ç©ºæ ¼ç¬¦å’ŒTab符,以åŠå›žè½¦æ¢è¡Œç¬¦<<\r\n>>。

字符集的缩写形å¼å¯ä»¥ç”¨åœ¨æ–¹æ‹¬å·ä¹‹å†…或之外。<<\s\d>>匹é…一个白字符åŽé¢ç´§è·Ÿä¸€ä¸ªæ•°å­—。<<[\s\d]>>匹é…å•个白字符或数字。<<[\da-fA-F]>>将匹é…一个å六进制数字。

å–å字符集的简写

<<[\S]>> = <<[^\s]>>

<<[\W]>> = <<[^\w]>>

<<[\D]>> = <<[^\d]>>

·        字符集的é‡å¤

如果你用“?*+â€æ“作符æ¥é‡å¤ä¸€ä¸ªå­—符集,你将会é‡å¤æ•´ä¸ªå­—符集。而ä¸ä»…是它匹é…的那个字符。正则表达å¼<<[0-9]+>>会匹é…837以åŠ222。

如果你仅仅想é‡å¤è¢«åŒ¹é…的那个字符,å¯ä»¥ç”¨å‘åŽå¼•用达到目的。我们以åŽå°†è®²åˆ°å‘åŽå¼•用。

 

 

6.      使用?*或+ 进行é‡å¤

?:告诉引擎匹é…å‰å¯¼å­—符0次或一次。事实上是表示å‰å¯¼å­—符是å¯é€‰çš„。

+:告诉引擎匹é…å‰å¯¼å­—符1次或多次

*:告诉引擎匹é…å‰å¯¼å­—符0次或多次

<[A-Za-z][A-Za-z0-9]*>åŒ¹é…æ²¡æœ‰å±žæ€§çš„HTML标签,“<â€ä»¥åŠâ€œ>â€æ˜¯æ–‡å­—符å·ã€‚第一个字符集匹é…一个字æ¯ï¼Œç¬¬äºŒä¸ªå­—符集匹é…ä¸€ä¸ªå­—æ¯æˆ–数字。

我们似乎也å¯ä»¥ç”¨<[A-Za-z0-9]+>。但是它会匹é…<1>。但是这个正则表达å¼åœ¨ä½ çŸ¥é“ä½ è¦æœç´¢çš„字符串ä¸åŒ…å«ç±»ä¼¼çš„æ— æ•ˆæ ‡ç­¾æ—¶è¿˜æ˜¯è¶³å¤Ÿæœ‰æ•ˆçš„。

 

·        é™åˆ¶æ€§é‡å¤

许多现代的正则表达å¼å®žçŽ°ï¼Œéƒ½å…许你定义对一个字符é‡å¤å¤šå°‘æ¬¡ã€‚è¯æ³•是:{min,max}。minå’Œmax都是éžè´Ÿæ•´æ•°ã€‚å¦‚æžœé€—å·æœ‰è€Œmax被忽略了,则max没有é™åˆ¶ã€‚如果逗å·å’Œmax都被忽略了,则é‡å¤min次。

因此{0,}和*一样,{1,}和+ 的作用一样。

ä½ å¯ä»¥ç”¨<<\b[1-9][0-9]{3}\b>>匹é…1000~9999之间的数字(“\bâ€è¡¨ç¤ºå•è¯è¾¹ç•Œ)。<<\b[1-9][0-9]{2,4}\b>>匹é…一个在100~99999之间的数字。

 

·        注æ„贪婪性

å‡è®¾ä½ æƒ³ç”¨ä¸€ä¸ªæ­£åˆ™è¡¨è¾¾å¼åŒ¹é…一个HTML标签。你知é“输入将会是一个有效的HTML文件,因此正则表达å¼ä¸éœ€è¦æŽ’除那些无效的标签。所以如果是在两个尖括å·ä¹‹é—´çš„内容,就应该是一个HTML标签。

许多正则表达å¼çš„æ–°æ‰‹ä¼šé¦–先想到用正则表达å¼<< <.+> >>,他们会很惊讶的å‘现,对于测试字符串,“This is a <EM>first</EM> testâ€ï¼Œä½ å¯èƒ½æœŸæœ›ä¼šè¿”回<EM>,然åŽç»§ç»­è¿›è¡ŒåŒ¹é…的时候,返回</EM>。

但事实是ä¸ä¼šã€‚正则表达å¼å°†ä¼šåŒ¹é…“<EM>first</EM>â€ã€‚å¾ˆæ˜¾ç„¶è¿™ä¸æ˜¯æˆ‘们想è¦çš„结果。原因在于“+â€æ˜¯è´ªå©ªçš„。也就是说,“+â€ä¼šå¯¼è‡´æ­£åˆ™è¡¨è¾¾å¼å¼•擎试图尽å¯èƒ½çš„é‡å¤å‰å¯¼å­—ç¬¦ã€‚åªæœ‰å½“è¿™ç§é‡å¤ä¼šå¼•起整个正则表达å¼åŒ¹é…失败的情况下,引擎会进行回溯。也就是说,它会放弃最åŽä¸€æ¬¡çš„“é‡å¤â€ï¼Œç„¶åŽå¤„ç†æ­£åˆ™è¡¨è¾¾å¼ä½™ä¸‹çš„部分。

和“+â€ç±»ä¼¼ï¼Œâ€œ?*â€çš„é‡å¤ä¹Ÿæ˜¯è´ªå©ªçš„。

 

·        深入正则表达å¼å¼•擎内部

让我们æ¥çœ‹çœ‹æ­£åˆ™å¼•擎如何匹é…å‰é¢çš„例å­ã€‚ç¬¬ä¸€ä¸ªè®°å·æ˜¯â€œ<â€ï¼Œè¿™æ˜¯ä¸€ä¸ªæ–‡å­—符å·ã€‚ç¬¬äºŒä¸ªç¬¦å·æ˜¯â€œ.â€ï¼ŒåŒ¹é…了字符“Eâ€ï¼Œç„¶åŽâ€œ+â€ä¸€ç›´å¯ä»¥åŒ¹é…其余的字符,直到一行的结æŸã€‚ç„¶åŽåˆ°äº†æ¢è¡Œç¬¦ï¼ŒåŒ¹é…失败(“.â€ä¸åŒ¹é…æ¢è¡Œç¬¦)。于是引擎开始对下一个正则表达å¼ç¬¦å·è¿›è¡ŒåŒ¹é…。也å³è¯•图匹é…“>â€ã€‚到目å‰ä¸ºæ­¢ï¼Œâ€œ<.+â€å·²ç»åŒ¹é…了“<EM>first</EM> testâ€ã€‚引擎会试图将“>â€ä¸Žæ¢è¡Œç¬¦è¿›è¡ŒåŒ¹é…,结果失败了。于是引擎进行回溯。结果是现在“<.+â€åŒ¹é…“<EM>first</EM> tesâ€ã€‚于是引擎将“>â€ä¸Žâ€œtâ€è¿›è¡ŒåŒ¹é…。显然还是会失败。这个过程继续,直到“<.+â€åŒ¹é…“<EM>first</EMâ€ï¼Œâ€œ>â€ä¸Žâ€œ>â€åŒ¹é…。于是引擎找到了一个匹é…“<EM>first</EM>â€ã€‚è®°ä½ï¼Œæ­£åˆ™å¯¼å‘的引擎是“急切的â€ï¼Œæ‰€ä»¥å®ƒä¼šæ€¥ç€æŠ¥å‘Šå®ƒæ‰¾åˆ°çš„第一个匹é…ã€‚è€Œä¸æ˜¯ç»§ç»­å›žæº¯ï¼Œå³ä½¿å¯èƒ½ä¼šæœ‰æ›´å¥½çš„匹é…,例如“<EM>â€ã€‚所以我们å¯ä»¥çœ‹åˆ°ï¼Œç”±äºŽâ€œ+â€çš„贪婪性,使得正则表达å¼å¼•擎返回了一个最左边的最长的匹é…。

 

·        用懒惰性å–代贪婪性

一个用于修正以上问题的å¯èƒ½æ–¹æ¡ˆæ˜¯ç”¨â€œ+â€çš„æƒ°æ€§ä»£æ›¿è´ªå©ªæ€§ã€‚ä½ å¯ä»¥åœ¨â€œ+â€åŽé¢ç´§è·Ÿä¸€ä¸ªé—®å·â€œ?â€æ¥è¾¾åˆ°è¿™ä¸€ç‚¹ã€‚“*â€ï¼Œâ€œ{}â€å’Œâ€œ?â€è¡¨ç¤ºçš„é‡å¤ä¹Ÿå¯ä»¥ç”¨è¿™ä¸ªæ–¹æ¡ˆã€‚因此在上é¢çš„例å­ä¸­æˆ‘们å¯ä»¥ä½¿ç”¨â€œ<.+?>â€ã€‚è®©æˆ‘ä»¬å†æ¥çœ‹çœ‹æ­£åˆ™è¡¨è¾¾å¼å¼•擎的处ç†è¿‡ç¨‹ã€‚

å†ä¸€æ¬¡ï¼Œæ­£åˆ™è¡¨è¾¾å¼è®°å·â€œ<â€ä¼šåŒ¹é…字符串的第一个“<â€ã€‚ä¸‹ä¸€ä¸ªæ­£åˆ™è®°å·æ˜¯â€œ.â€ã€‚这次是一个懒惰的“+â€æ¥é‡å¤ä¸Šä¸€ä¸ªå­—符。这告诉正则引擎,尽å¯èƒ½å°‘çš„é‡å¤ä¸Šä¸€ä¸ªå­—符。因此引擎匹é…“.â€å’Œå­—符“Eâ€ï¼Œç„¶åŽç”¨â€œ>â€åŒ¹é…“Mâ€ï¼Œç»“果失败了。引擎会进行回溯,和上一个例å­ä¸åŒï¼Œå› ä¸ºæ˜¯æƒ°æ€§é‡å¤ï¼Œæ‰€ä»¥å¼•擎是扩展惰性é‡å¤è€Œä¸æ˜¯å‡å°‘,于是“<.+â€çŽ°åœ¨è¢«æ‰©å±•ä¸ºâ€œ<EMâ€ã€‚引擎继续匹é…下一个记å·â€œ>â€ã€‚这次得到了一个æˆåŠŸåŒ¹é…。引擎于是报告“<EM>â€æ˜¯ä¸€ä¸ªæˆåŠŸçš„åŒ¹é…。整个过程大致如此。

 

·        惰性扩展的一个替代方案

我们还有一个更好的替代方案。å¯ä»¥ç”¨ä¸€ä¸ªè´ªå©ªé‡å¤ä¸Žä¸€ä¸ªå–å字符集:“<[^>]+>â€ã€‚之所以说这是一个更好的方案在于使用惰性é‡å¤æ—¶ï¼Œå¼•擎会在找到一个æˆåŠŸåŒ¹é…å‰å¯¹æ¯ä¸€ä¸ªå­—符进行回溯。而使用å–å字符集则ä¸éœ€è¦è¿›è¡Œå›žæº¯ã€‚

最åŽè¦è®°ä½çš„æ˜¯ï¼Œæœ¬æ•™ç¨‹ä»…仅谈到的是正则导å‘的引擎。文本导å‘的引擎是ä¸å›žæº¯çš„ã€‚ä½†æ˜¯åŒæ—¶ä»–ä»¬ä¹Ÿä¸æ”¯æŒæƒ°æ€§é‡å¤æ“作。

 

7.      使用“.â€åŒ¹é…几乎任æ„字符

在正则表达å¼ä¸­ï¼Œâ€œ.â€æ˜¯æœ€å¸¸ç”¨çš„符å·ä¹‹ä¸€ã€‚ä¸å¹¸çš„æ˜¯ï¼Œå®ƒä¹Ÿæ˜¯æœ€å®¹æ˜“被误用的符å·ä¹‹ä¸€ã€‚

“.â€åŒ¹é…一个å•个的字符而ä¸ç”¨å…³å¿ƒè¢«åŒ¹é…çš„å­—ç¬¦æ˜¯ä»€ä¹ˆã€‚å”¯ä¸€çš„ä¾‹å¤–æ˜¯æ–°è¡Œç¬¦ã€‚åœ¨æœ¬æ•™ç¨‹ä¸­è°ˆåˆ°çš„å¼•æ“Žï¼Œç¼ºçœæƒ…况下都是ä¸åŒ¹é…æ–°è¡Œç¬¦çš„ã€‚å› æ­¤åœ¨ç¼ºçœæƒ…况下,“.â€ç­‰äºŽæ˜¯å­—符集[^\n\r](Window)或[^\n]( Unix)的简写。

这个例外是因为历å²çš„原因。因为早期使用正则表达å¼çš„工具是基于行的。它们都是一行一行的读入一个文件,将正则表达å¼åˆ†åˆ«åº”用到æ¯ä¸€è¡Œä¸ŠåŽ»ã€‚åœ¨è¿™äº›å·¥å…·ä¸­ï¼Œå­—ç¬¦ä¸²æ˜¯ä¸åŒ…嫿–°è¡Œç¬¦çš„。因此“.â€ä¹Ÿå°±ä»Žä¸åŒ¹é…新行符。

现代的工具和语言能够将正则表达å¼åº”用到很大的字符串甚至整个文件上去。本教程讨论的所有正则表达å¼å®žçŽ°éƒ½æä¾›ä¸€ä¸ªé€‰é¡¹ï¼Œå¯ä»¥ä½¿â€œ.â€åŒ¹é…所有的字符,包括新行符。在RegexBuddy, EditPad Pro或PowerGREP等工具中,你å¯ä»¥ç®€å•的选中“点å·åŒ¹é…新行符â€ã€‚在Perl中,“.â€å¯ä»¥åŒ¹é…新行符的模å¼è¢«ç§°ä½œâ€œå•行模å¼â€ã€‚很ä¸å¹¸ï¼Œè¿™æ˜¯ä¸€ä¸ªå¾ˆå®¹æ˜“混淆的åè¯ã€‚因为还有所谓“多行模å¼â€ã€‚多行模å¼åªå½±å“行首行尾的锚定(anchor),而å•行模å¼åªå½±å““.â€ã€‚

其他语言和正则表达å¼åº“也采用了Perl的术语定义。当在.NET Framework中使用正则表达å¼ç±»æ—¶ï¼Œä½ å¯ä»¥ç”¨ç±»ä¼¼ä¸‹é¢çš„è¯­å¥æ¥æ¿€æ´»å•行模å¼ï¼šRegex.Match(“stringâ€,â€regexâ€,RegexOptions.SingleLine)

 

 

·        ä¿å®ˆçš„使用点å·â€œ.â€

点å·å¯ä»¥è¯´æ˜¯æœ€å¼ºå¤§çš„元字符。它å…è®¸ä½ å·æ‡’:用一个点å·ï¼Œå°±èƒ½åŒ¹é…几乎所有的字符。但是问题在于,它也常常会匹é…ä¸è¯¥åŒ¹é…的字符。

我会以一个简å•çš„ä¾‹å­æ¥è¯´æ˜Žã€‚让我们看看如何匹é…一个具有“mm/dd/yyâ€æ ¼å¼çš„æ—¥æœŸï¼Œä½†æ˜¯æˆ‘们想å…许用户æ¥é€‰æ‹©åˆ†éš”符。很快能想到的一个方案是<<\d\d.\d\d.\d\d>>ã€‚çœ‹ä¸ŠåŽ»å®ƒèƒ½åŒ¹é…æ—¥æœŸâ€œ02/12/03â€ã€‚问题在于02512703也会被认为是一个有效的日期。

<<\d\d[-/.]\d\d[-/.]\d\d>>看上去是一个好一点的解决方案。记ä½ç‚¹å·åœ¨ä¸€ä¸ªå­—ç¬¦é›†é‡Œä¸æ˜¯å…ƒå­—符。这个方案远ä¸å¤Ÿå®Œå–„,它会匹é…“99/99/99â€ã€‚而<<[0-1]\d[-/.][0-3]\d[-/.]\d\d>>åˆæ›´è¿›ä¸€æ­¥ã€‚尽管他也会匹é…“19/39/99â€ã€‚你想è¦ä½ çš„æ­£åˆ™è¡¨è¾¾å¼è¾¾åˆ°å¦‚何完美的程度å–决于你想达到什么样的目的。如果你想校验用户输入,则需è¦å°½å¯èƒ½çš„å®Œç¾Žã€‚å¦‚æžœä½ åªæ˜¯æƒ³åˆ†æžä¸€ä¸ªå·²çŸ¥çš„æºï¼Œå¹¶ä¸”æˆ‘ä»¬çŸ¥é“æ²¡æœ‰é”™è¯¯çš„æ•°æ®ï¼Œç”¨ä¸€ä¸ªæ¯”è¾ƒå¥½çš„æ­£åˆ™è¡¨è¾¾å¼æ¥åŒ¹é…ä½ æƒ³è¦æœå¯»çš„字符就已ç»è¶³å¤Ÿã€‚

 

8.      字符串开始和结æŸçš„锚定

锚定和一般的正则表达å¼ç¬¦å·ä¸åŒï¼Œå®ƒä¸åŒ¹é…任何字符。相å,他们匹é…çš„æ˜¯å­—ç¬¦ä¹‹å‰æˆ–之åŽçš„ä½ç½®ã€‚“^â€åŒ¹é…一行字符串第一个字符å‰çš„ä½ç½®ã€‚<<^a>>将会匹é…字符串“abcâ€ä¸­çš„a。<<^b>>å°†ä¸ä¼šåŒ¹é…“abcâ€ä¸­çš„任何字符。

类似的,$匹é…字符串中最åŽä¸€ä¸ªå­—符的åŽé¢çš„ä½ç½®ã€‚所以<<c$>>匹é…“abcâ€ä¸­çš„c。

 

·        锚定的应用

在编程语言中校验用户输入时,使用锚定是éžå¸¸é‡è¦çš„。如果你想校验用户的输入为整数,用<<^\d+$>>。

用户输入中,常常会有多余的å‰å¯¼ç©ºæ ¼æˆ–结æŸç©ºæ ¼ã€‚ä½ å¯ä»¥ç”¨<<^\s*>>å’Œ<<\s*$>>æ¥åŒ¹é…å‰å¯¼ç©ºæ ¼æˆ–结æŸç©ºæ ¼ã€‚

 

·        使用“^â€å’Œâ€œ$â€ä½œä¸ºè¡Œçš„开始和结æŸé”šå®š

如果你有一个包å«äº†å¤šè¡Œçš„字符串。例如:“first line\n\rsecond lineâ€(其中\n\r表示一个新行符)。常常需è¦å¯¹æ¯è¡Œåˆ†åˆ«å¤„ç†è€Œä¸æ˜¯æ•´ä¸ªå­—符串。因此,几乎所有的正则表达å¼å¼•擎都æä¾›ä¸€ä¸ªé€‰é¡¹ï¼Œå¯ä»¥æ‰©å±•这两ç§é”šå®šçš„å«ä¹‰ã€‚“^â€å¯ä»¥åŒ¹é…字串的开始ä½ç½®(在f之å‰)ï¼Œä»¥åŠæ¯ä¸€ä¸ªæ–°è¡Œç¬¦çš„åŽé¢ä½ç½®(在\n\rå’Œs之间)。类似的,$会匹é…字串的结æŸä½ç½®(最åŽä¸€ä¸ªe之åŽ)ï¼Œä»¥åŠæ¯ä¸ªæ–°è¡Œç¬¦çš„å‰é¢(在e与\n\r之间)。

在.NETä¸­ï¼Œå½“ä½ ä½¿ç”¨å¦‚ä¸‹ä»£ç æ—¶ï¼Œå°†ä¼šå®šä¹‰é”šå®šåŒ¹é…æ¯ä¸€ä¸ªæ–°è¡Œç¬¦çš„å‰é¢å’ŒåŽé¢ä½ç½®ï¼šRegex.Match(”string”, “regex”, RegexOptions.Multiline)

应用:string str = Regex.Replace(Original, “^”, “> “, RegexOptions.Multiline)–将会在æ¯è¡Œçš„行首æ’入“> â€ã€‚

 

·        ç»å¯¹é”šå®š

<<\A>>åªåŒ¹é…整个字符串的开始ä½ç½®ï¼Œ<<\Z>>åªåŒ¹é…整个字符串的结æŸä½ç½®ã€‚å³ä½¿ä½ ä½¿ç”¨äº†â€œå¤šè¡Œæ¨¡å¼â€ï¼Œ<<\A>>å’Œ<<\Z>>也从ä¸åŒ¹é…新行符。

å³ä½¿\Zå’Œ$åªåŒ¹é…字符串的结æŸä½ç½®ï¼Œä»ç„¶æœ‰ä¸€ä¸ªä¾‹å¤–的情况。如果字符串以新行符结æŸï¼Œåˆ™\Zå’Œ$å°†ä¼šåŒ¹é…æ–°è¡Œç¬¦å‰é¢çš„ä½ç½®ï¼Œè€Œä¸æ˜¯æ•´ä¸ªå­—符串的最åŽé¢ã€‚è¿™ä¸ªâ€œæ”¹è¿›â€æ˜¯ç”±Perl引进的,然åŽè¢«è®¸å¤šçš„æ­£åˆ™è¡¨è¾¾å¼å®žçŽ°æ‰€éµå¾ªï¼ŒåŒ…括Java,.NET等。如果应用<<^[a-z]+$>>到“joe\nâ€ï¼Œåˆ™åŒ¹é…结果是“joeâ€è€Œä¸æ˜¯â€œjoe\nâ€ã€‚

æ— èŠä¸­è¿‡ç€

essay 2 Comments »

转眼间已ç»å¿«åˆ°å¤§å­¦æ¯•业,感觉有很多的事情没有去åšï¼Œå¦‚果现在是大1或大2,也许å¯ä»¥åŽ»å®žæ–½æˆ‘çš„æƒ³æ³•ã€‚
 在这个暑å‡å¿«å¼€å§‹çš„æ—¶å€™ï¼Œå†³å®šåŽ»åšä¸€ä¸ªå·²å¹¿æ’­å‰§ä¸ºä¸»é¢˜çš„网站,人类获å–ä¿¡æ¯æœ‰3ç§æ–¹å¼ã€‚1:文字;2:视频;3:耳朵(广播)。å‰é¢2ç§åœ¨ç½‘ç»œæˆ–è€…çŽ°å®žä¸­ï¼Œèƒ½æƒ³åˆ°çš„æ–¹å¼æˆ–者说是模å¼éƒ½å·²ç»è¢«äººä»¬åšå®Œï¼Œå‰©ä¸‹çš„åªå‰©ä¸‹å¹¿æ’­ï¼Œåœ¨05ï¼08年这段时间广播电å°çš„䏿–­å…´èµ·ï¼Œææ€•ä¹Ÿè¯æ˜Žäº†è¿™ç‚¹ï¼Œç½‘络上也开始慢慢的起æ¥ï¼Œä¸è¿‡è¿˜æ²¡æœ‰ä»€ä¹ˆå¤§åž‹çš„网站出现,最近了解到的也就是一个动å¬ä¸­å›½ï¼Œå…¶å®žbaiduå’Œgoogleåˆæˆ–是yahoo为什么ä¸åŽ»å¼„ä¸€ä¸ªå¹¿æ’­å‰§æœç´¢ï¼Œåœ¨ç™¾åº¦çŸ¥é“和百度贴å§ä¸Šçœ‹åˆ°æ±‚这个方é¢çš„人还是蛮多的,这个也许就是被人忽视的方é¢ã€‚
 以上是我在最近几天想到的一ç§ç®—是å«åšèµšé’±çš„东西。一个月的暑å‡ï¼Œåœ¨10多å·çš„æ—¶å€™æœ‹å‹éƒ½èµ°å…‰äº†ï¼ŒåŠä¸ªå¤šæœˆçš„æ— èŠç”Ÿæ´»ï¼Œç³Ÿç³•é€é¡¶äº†ï¼Œæƒ³èµ·åœ¨é«˜3的时候没有多认识一些朋å‹ï¼ŒçœŸçš„æ˜¯æ¯”è¾ƒçš„åŽæ‚”ã€‚ã€‚çŽ°åœ¨å·²ç»æ²¡æœ‰äº†å½“åˆé‚£ç§ä¸Šç½‘的激情,记得还是高中毕业的时候æ¯å¤©æ—©ä¸Šç«Ÿç„¶å¯ä»¥6点的时候起æ¥ä¸Šç½‘,真的是ä¸å¯æ€è®®ã€‚
 快毕业了,é¢ä¸´çš„自然是è¦åŽ»æ‰¾å·¥ä½œï¼Œphp现在å‘现越æ¥è¶Šå¤šçš„䏿‡‚,比如关于很多的函数,上次在phpchina看到的一个yahooçš„é¢è¯•,å‘现连最简å•çš„print_f输出数组都ä¸çŸ¥é“,看了下phpwindçš„install.php文件,å‘现根本ä¸çŸ¥é“他写的是什么东西,看æ¥éœ€è¦æé«˜çš„东西真的有很多,SQL连索引都ä¸çŸ¥é“,还真是失败

天使ä¸åœ¨çº¿ç»“å±€

essay No Comments »

现在已ç»å¾ˆå°‘有å°è¯´èƒ½è®©æˆ‘感触,《天使ä¸åœ¨çº¿ã€‹æ˜¯ä¸ºæ•°ä¸å¤šçš„一篇,和大多数人一样,会对这部å°è¯´æ„Ÿå…´è¶£ï¼Œæ˜¯å› ä¸ºä»¥ä¸ºè¿™æ˜¯éƒ¨sexçš„å°è¯´ï¼Œå‰é¢å¼€å¤´æœ‰ä¸€äº›æš§æ˜§çš„片段,ä¸è¿‡è¶Šå¾€ä¸‹åŽ»çœ‹ï¼Œè¶Šå‘现这是一部ä¸å¯å¤šå¾—的悬疑å°è¯´ï¼Œå…¶ä¸­ä¹Ÿä¸ä¹å¯¹äººç”Ÿå’Œç½‘络世间的æ€è€ƒã€‚
 简介:本书是国内第一部根æ®â€œè§†é¢‘å¥³éƒŽâ€æ—¥è®°æ”¹ç¼–ã€ä»¥æ­éœ²ç½‘络色情犯罪为题æçš„长篇å°è¯´ï¼Œä½œè€…深刻剖æžä¸­å›½ç½‘络色情犯罪领域的现状与本质,以大胆的笔触和独特的视角,诠释了从事网络色情犯罪行业的人的真实心æ€ï¼Œå¡‘造了在中国大é‡å­˜åœ¨çš„“社会空虚æ—â€çš„群体形象,并且首次批露了鲜为人知的网络色情罪案的侦破过程,是一部悬念丛生ã€å¯è¯»æ€§æžå¼ºçš„社会文学作å“。
 文章已一个å«å‡¤å‡°çš„ç¥žç§˜äººä¸ºä¸»è¦æ‚¬ç–‘,直至å°è¯´çš„æœ€åŽä¹Ÿæ²¡æœ‰å‡ºçŽ°å…·ä½“è¯´è¿™ä¸ªäººæ˜¯è°ï¼Œé›¯é›¯æˆ–å®‰çªæˆ–åˆä¼šæ˜¯é¡¾è¥„ï¼Œå…¶å®žæœ€åŽæ˜¯è°å·²ç»ä¸é‡è¦äº†ï¼Œä¸çŸ¥é“为什么看完之åŽï¼Œå¾ˆåŽ‹æŠ‘ï¼Œç”¨googleæœç´¢åˆ°ç™¾åº¦è´´å§é‡Œï¼Œå‘现很多人都和我一样,看到应该看到的东西和ä¸åº”该看到的东西,人性丑æ¶çš„䏀颿¯«æ— ä¿ç•™åœ°è¡¨çŽ°å‡ºæ¥,ç„¶åŽè¿½æ ¹ç©¶åº•,å…¶æ ¹æºè¿˜æ˜¯åœ¨æˆ‘们现实生活中.看完这部å°è¯´,的确有很多问题,值仔细æ€è€ƒä¸€ä¸‹ã€‚天使的英文å«angel,男主角的妻å­å«å®‰çªï¼Œè€Œå°è¯´åå«ã€Šå¤©ä½¿ä¸åœ¨çº¿ã€‹ï¼Œç¥žç§˜äººç‰©æ˜¯å‡¤å‡°ï¼Œä¸çŸ¥é“其中有没有æŸç§è”系。
 花了近一个星期的时间看完了整本å°è¯´ï¼Œè¿™ä¸ªæ˜ŸæœŸå¾ˆå¿™ï¼Œæ¯å¤©éƒ½å¾ˆæ™šç¡è§‰ï¼Œå¹¶ä¸æ˜¯å¿™åˆ°æ·±å¤œï¼Œè€Œæ˜¯ç¡ä¸ç€ï¼Œæ‰ä¼šåŽ»é˜…è¯»ã€Šå¤©ä½¿ä¸åœ¨çº¿ã€‹ã€‚准备了2个月的实习,å‰å‡ å¤©æ‰å‘Šè¯‰æˆ‘ä¸èƒ½åŽ»ï¼Œå¿…é¡»è¦åŽ»å­¦æ ¡æŒ‡å®šçš„åœ°æ–¹ï¼Œfuck学校,å‚加网易的比赛,已ç»è¢«æ·˜æ±°äº†ï¼Œä½†æ˜¯è¿˜æ˜¯å¸Œæœ›èƒ½åšä¸‹æœ€åŽçš„努力。和åŒå­¦åˆä½œå‡†å¤‡åšä¸€ä¸ªæ¯”较特别的站点,没想到校内先åšäº†ä¸€ä¸ªç±»ä¼¼çš„出æ¥ï¼Œä¸è¿‡è‡³å°‘è¯æ˜Žäº†è¿™ä¸ªæƒ³æ³•是有æ„义的。
Â è™½ç„¶çŽ°åœ¨åªæœ‰2门课但是2个BTçš„è€å¸ˆï¼Œä¸€ä¸ªå®žéªŒæŠ¥å‘Šè¿˜è¦å†™çš„那么麻烦,昨天也ä¸çŸ¥é“那根神ç»ç§€é€—了,竟然冒ç€é›¨åŽ»äº†æœ¬åœ°çš„ä¸€ä¸ªå…¶ä»–å­¦æ ¡ï¼Œä¸è¿‡å‡ºåŽ»èµ°èµ°ä¹Ÿè›®ä¸é”™äº†è‡³å°‘çœ‹åˆ°è¿™ä¸ªåŸŽå¸‚è¿˜æœ‰ä¸€æ‰€æ¯”è¾ƒåƒæ ·çš„学校,cet4å¿«å¼€å§‹äº†ï¼Œå­¦æ ¡é‡Œå¿™çš„ä¸æ˜¯æŠ“紧时间看书,而是答案,想起在一篇sex文章下一个人的留言:有了钱æ‰èƒ½æœ‰sex,很现实。学校模仿了cctv赢在中国的举办了一个å«èµ¢åœ¨æ ¡å›­çš„æ¯”赛,里é¢çš„内容还ä¸é”™ã€‚hellophper.com这个网站还有很多功能没有åšå¥½ï¼Œ94share。com百度的收录也越æ¥è¶Šå°‘了,也很想æ¢ä¸€ä¸ªæ¨¡æ¿ï¼Œæ²¡æœ‰æ—¶é—´ï¼Œè¿˜æœ‰as3也想å†çœ‹çœ‹ï¼Œè¿˜æœ‰äº›php的框架。
 想起å‰å‡ å¤©ï¼Œæˆ‘å“¥æ‰“ç”µè¯æ¥è¯´ï¼Œå¸®æˆ‘找一个实习的å•ä½ï¼Œæœªæžœã€‚Wait…,下åˆç¡äº†ä¸€ä¸ªä¸‹åˆï¼Œä¸è¿‡è¿˜æ˜¯ä¸èƒ½è®©æˆ‘的头脑清新起æ¥ï¼Œå›°ä½†æ˜¯æ— çœ ã€‚çœ‹ç€æˆ¿é—´é‡Œæ»¡åœ°ç‹¼ç±ï¼Œä¸€å¤§å †çš„è¡£æœæ²¡æœ‰æ´—,地也è„çš„ä¸èƒ½å†è„了。
 事情还是蛮多的,生活还是è¦ç»§ç»­çš„。by 2008.6.15

追求

essay No Comments »

 一直在想一个问题,人的一生究竟应该怎么过,我ä¸çŸ¥é“100å¹´åŽä¼šæ€Žä¹ˆæ ·ï¼Œå¦‚果是在一个的时候,想想自觉死亡åŽçš„æ—¶é—´ï¼Œè¿˜æ˜¯è›®å¯æ€•的。
 花了一天2å¤œçœ‹å®Œäº†ã€Šå­¦è­¦å‡ºæ›´ã€‹ï¼Œæ•…äº‹ä¸æ€Žä¹ˆæ ·ï¼Œå¾ˆè€å¥—ï¼Œåªæ˜¯çœ‹çš„æ—¶å€™å¿ƒå¢ƒæœ‰äº›ä¸åŒï¼Œæ‰€ä»¥è¿˜æ˜¯è›®æœ‰æ„Ÿè§‰çš„。主è¦ä¹Ÿå°±æ˜¯è¯´ä¸€äº›è­¦å‘˜ä¸Šç­ä¸‹ç­åŽçš„一些生活,我ä¸çŸ¥é“为什么电视剧总是有那么多的人喜欢看,å¯èƒ½æ˜¯å› ä¸ºæ¯”较å‘往那里é¢çš„生活,真ä¸çŸ¥é“一个å°å°çš„警察为什么å¯ä»¥ä½é‚£ä¹ˆå¤§çš„æˆ¿å­ï¼Œå¹¶ä¸”从æ¥ä¸ä¼šä¸ºé‡‘钱的事情担忧过,无论是什么人,哪怕是一无是处的人,也å¯ä»¥å¾ˆå®¹æ˜“的找到工作,当一个人无所谓钱的问题,剩下的自然是感情的问题。这部片å­è®©æˆ‘最大感触的就是结尾,女主角死了。一般的结局大多是完美的,自然这部å¯ä»¥è®©æ­¤æ—¶çš„æˆ‘,有一些对生活的æ€è€ƒã€‚
 一生ä¸é•¿100å¹´å·¦å³ï¼Œæ˜¯åŽ»æ‰¿æ‹…å¯¹è¿™ä¸ªç¤¾ä¼šçš„è´£ä»»ï¼Œè¿˜æ˜¯åŽ»èµšå¾ˆå¤šçš„é’±åŽ»æŠ¥ç­”çˆ¶æ¯ï¼Œè¿˜æ˜¯åŽ»äº«å—,ä¸çŸ¥é“为什么现在有一ç§è¢«ä¸–界隔离的感觉。其实我现在的生活还算是ä¸é”™çš„,æ¯å¤©æ™šä¸Šå¯ä»¥å®‰é™çš„一个人上网,泡一æ¯ç‰›å¥¶ï¼Œè‡ªå·±è¿˜èƒ½èµšä¸€äº›é’±ï¼Œè‡ªç„¶ä¹Ÿä¸ç”¨é‚£ä¹ˆçš„为钱的事烦æ¼ï¼Œçˆ¶æ¯å¯¹æˆ‘用钱也比较支æŒã€‚我是最早离开学校租房å­ä½çš„,现在和我ä½çš„人ç»å¸¸çš„ä¸åœ¨ï¼ŒåŸºæœ¬ä¸Šå¯ä»¥è¯´å°±æ˜¯æˆ‘一个人ä½é‚£ä¹ˆå¤§çš„æˆ¿å­ï¼Œå­¦æ ¡çš„课现在也是å¯åŽ»å¯ä¸åŽ»ï¼ŒçŽ¯å¢ƒä¹Ÿæ¯”è¾ƒçš„å®‰é™ï¼Œä¼¼ä¹Žä¸€åˆ‡çœ‹èµ·æ¥éƒ½æ¯”较的美好,ä¸çŸ¥é“为什么看了电视以åŽï¼Œè¿˜ä¼šæœ‰è¿™ç§å¥‡æ€ªçš„æ„Ÿè§‰ï¼Œå¾ˆç¾¡æ…•å‰§ä¸­çš„ç”Ÿæ´»ï¼Œä½†æ˜¯çŽ°åœ¨å´æœ‰ä¸€ç§æ‰¾ä¸åˆ°æ–¹å‘的感觉,刚刚å°è¯•的写了几行的cssä¸€ç‚¹æ„Ÿè§‰éƒ½æ²¡æœ‰ï¼ŒçŽ°åœ¨æœ‰ç‚¹æƒ³å›žå®¶çš„æ„Ÿè§‰ï¼Œå…¶å®žåˆ°äº†å®¶é‡Œä¹Ÿå°±æ˜¯ä¸Šä¸Šç½‘ï¼ŒçœŸçš„ä¸æ˜Žç™½è‡ªå·±åœ¨è¿½æ±‚什么。
 在学校我的æˆç»©ä¸ç®—是最好,但是也还ä¸é”™ï¼Œæ²¡æœ‰ä»»ä½•é‡ä¿®çš„ï¼Œä¹Ÿä¸æ˜¯å¤ªä¸ºå·¥ä½œçš„事情担忧,å¶è€Œä¹Ÿä¼šå޻外é¢çŽ©ä¸‹ï¼ŒåŸºæœ¬ä¸Šå¯ä»¥è¯´é™¤äº†å¥³å‹ä¸€åˆ‡éƒ½æ¯”较的完美,ä¸çŸ¥é“æ˜¯ä¸æ˜¯å®³æ€•å¤±åŽ»è¿™ç§æ¡ä»¶çš„生活所以害怕。刚刚å¬äº†ä¸‹å¹¿æ’­ï¼Œå‘现竟然一个最喜欢的节目ä¸è§äº†ï¼ŒçœŸä¸çŸ¥é“电å°åœ¨å¹²ä»€ä¹ˆã€‚
 一个人的时候整ç†äº†ä¸‹ä¸œè¥¿ï¼ŒæŠŠå·²ç»è€ƒå®Œçš„书放了起æ¥ï¼Œçªç„¶æœ‰ç‚¹å›žåˆ°äº†é«˜3ç»“æŸæ—¶çš„æ„Ÿè§‰ï¼Œé‚£ä¹ˆå¤šåŽŸæœ¬é‡è¦çš„书现在还ä¸å¦‚一本故事会,一切似乎有回到了原始的状æ€ã€‚一直有一ç§å¹»æƒ³ï¼Œå’Œä¸€ç¾¤åŒäº‹ä¸‹ç­åŽåŽ»bar里玩,9ï¼10点的时候回到家å¯ä»¥è½»æ¾çš„æ‰“开电脑,ä¸ç”¨åœ¨åŽ»æ€è€ƒè¿˜åº”该去åšä»€ä¹ˆã€‚ä¹Ÿä¸€ç›´å¹»æƒ³æœ‰ä¸€å¥—é æµ·è¾¹çš„æˆ¿å­ï¼Œèƒ½å¤Ÿæœ‰ä¸€ä¸ªçŽ¯è¡Œé€æ˜Žçš„大窗å­èµ·æ¥åŽå¯ä»¥ç›´æŽ¥çœ‹åˆ°æµ·è¾¹çš„风景,周末晚饭åŽå¯ä»¥ä¼˜å…ˆçš„去海边散步,早上å¯ä»¥è¢«æŸ”美çš