??xml version="1.0" encoding="utf-8" standalone="yes"?>
Go语言是Google推出的新的一个致力于pȝU的~程语言。很多h说它?C + PythonQ既有c的灵z高效,又有Python的简单易用,它的原则?Simple && Fast。它的语法规则很单。其官方|站上有一个《三天学会Go语言》的教程Q包括三部分Q基本结构,面向对象Qƈ发。一个周末的旉差不多可以掌握其基本面貌。相Ҏ_W三部分“q发”g难接受一些。但是如果你对多U程Q同步,消息队列q些东西很有l验的话Q对它的概念也会Ҏ理解?br>
2.Go语言的面向对?/span>
Go语言在C语言语法的基上,以最z的形式加入了面向对象?br> 关于l承QGo语言没有l承。但是它支持嵌入Q这个有点类g其它语言的mixinQ可以用来模拟ѝ?br> 关于多态:Go 语言的最大特Ҏ它的接口定义。所?#8220;接口”Q就是一l方法的集合。Q何一个类只要实现了一个接口的所有方法,则是该接口的实现者,不需要显式声明实现该接口。所以一个没有Q何方法的I接口可以代表Q何类型?br style="FONT-WEIGHT: bold">
3.Go语言的ƈ?/span>
Go语言提出一个新的概念—Go例程Q有点类gU程Q但是更加轻量,更省资源。Go例程之间的通信方式 ——信道,q是GO 语言的核心概念,有点cM于UNIX的Pipe。在Go语言中,不需要接触线E,锁这些低阶概c?br>
4.Go语言可以用来做什?/span>
Go语言目前最强的是它的网l功能。它的package中已l实C最常见的网l协议和~码处理。Go的官方网站用的是Go语言Q实际上它就是Go的文档系lgodoc?br> q没有官方对数据库支持,不过因ؓ通过某种办法可以在Go语言中直接调用C函数Q所以很Ҏ的实现对MYSQL 或?Sqlite q些数据库的支持?br> 至于GUIQ这估计目前q不在设计者的考虑范围之内Q因Z们连Windows都不舍得支持。不q可以通过它的http包和template包等{,已经构成了一个WEB框架Q可以用来实现WEB GUI的开发,使用Go写一个带有\径分zHttp服务器也几行代码的事?br>
]]>
?994q? Greg Colvin向C++标准委员会提Z自己设计的智能指针:auto_ptr和counted_ptr。auto_ptr实现基本的RAII理Q不可复Ӟcounted_ptr采用引用计数实现了一个可复制的智能指针。两者用于不同的场合?br> 但是标准委员会最l只通过了auto_ptrQƈ且对auto_ptr加入了一个古怪的“所有权转移”语义。后来auto_ptr和counted_ptrq入了Boost C++ 库,改名为scoped_ptr和shared_ptr?br>
std::auto_ptr只所以设计ؓ可拷贝的Q也许是Z以下考虑Q比如下例函敎ͼ
f1中的参数所指向的对象应该由谁来删除呢?调用者还是被调用者?如果不看E序文档的话Q无法知道这一炏Vf2函数也存在同L问题?br>
用auto_ptr可以消除q种歧义性:
管如此Qauto_ptr?#8220;所有权转移”语义q是会带来副作用Q因Z修改原值的帔R拯q背了一般的设计原则Q它也许会在你意想不到的情况下就把对象{UM。它也不能用于标准容器中?br> 所以auto_ptr在新的标准库已经不再推荐使用。取而代之的是unique_ptr。unique_ptr与auto_ptrcMQ但限制了auto_ptr的拷贝行为。同Ӟ像上面D的例子一Punique_ptr可以作ؓ函数的参数和q回g用。这是因为C++增加了一个新的特征:叛_引用?br>
shared_ptr也进入了标准库。对于引用计数的指针而言Q@环引用是一个大问题。标准库为此把shared_ptr定义为强引用指针Q它q实C一个弱引用指针weak_ptr。显Ӟ标准库ƈ没有从根本上解决循环引用的问题,它把q个问题交给了程序员。在一个简单的pȝ中,你可以区分用shared_ptr和weak_ptrQ以此来避免出现循环引用。但是在一个大的对象系l中Q有时还是容易出错。@环引用的问题Q严重减׃shared_ptr的可用性?br>
那么能不能自动检是否出现@环引用呢Q事实上Q对于shared_ptrq种使用非R入式{略实现的智能指针,是很隑֮现自动检的。但是如果采用R入式设计Q我们可以引入一些接口,来解册个问题。@环引用的,实际上是图论中的回\问题?br>
本文?a style="FONT-SIZE: 12pt" title="eXile" href="http://www.shnenglu.com/eXile/">eXile 原创Q{载请表明原脓地址?nbsp;http://www.shnenglu.com/eXile/?/p>
成员_reserverd是一个字W串集合Q它存储已经建立回话Q但是还没有加入聊天室的客户名。_members存储当前聊天室的所有用P已经调用qjoin函数的用P?br>
成员函数 reserve ?unreserve l护 _reserved 集合?/p>
join操作d用户到聊天室?/p>
send实现Q同join实现非常cMQ?/p>
c?ChatRoomCallbackAdapter
注意Q在使用join传递代理之前,向客户代理添加了一个gؓ "o" 的_fwd上下文。它提示Glacier使用单向调用来{发客户回调。这h双向调用更加有效。因为所有的回调操作均ؓvoidq回|所以可以单向调用?br> 服务器的回调为普通的双向调用。这样当出错时可以通知服务器。当客户端出错时Q这个对l束客户会话很有用?br>
一旦客戯用了setCallbackQ就可以接收聊天室的各种行ؓ通知。下为send实现Q?/p>
客户要离开聊天室,只要调用 destory.
版本Qv2.3 (2008-4-13) 作者:deerchao 转蝲h?a >来源
30分钟内让你明白正则表辑ּ是什么,q对它有一些基本的了解Q让你可以在自己的程序或|页里用它?/p>
最重要的是——请l我30分钟Q如果你没有使用正则表达式的l验Q请不要试图?0U?/em>内入门——除非你是超?:)
别被下面那些复杂的表辑ּ吓倒,只要跟着我一步一步来Q你会发现正则表辑ּ其实q?span lang="zh-cn">没有你想? 中的那么困难。当Ӟ如果你看完了q篇教程之后Q发现自己明白了很多Q却又几乎什么都C得,那也是很正常的——我认ؓQ没接触q正则表辑ּ的h在看完这 教E后Q能把提到过的语法记?0%以上的可能性ؓ零。这里只是让你明白基本的原理Q以后你q需要多l习Q多使用Q才能熟l掌握正则表辑ּ?/p>
除了作ؓ入门教程之外Q本文还试图成ؓ可以在日常工作中使用的正则表辑ּ语法参考手册。就作者本人的l历来说Q这个目标还是完成得不错的——你看,我自׃没能把所有的东西C来,不是吗?
清除格式 文本格式U定Q?span class="name">专业术语 元字W?语法格式 正则表达?/span> 正则表达式中的一部分(用于分析) 对其q行匚w的源字符?/span> Ҏ则表辑ּ或其中一部分的说?/span>
隐藏Ҏ 本文双有一些注释,主要是用来提供一些相关信息,或者给没有E序员背景的读者解释一些基本概念,通常可以忽略?/p>
字符是计机软g处理文字时最基本的单位,可能是字母,数字Q标点符PI格Q换行符Q汉字等{?span class="name">字符?/span>?个或更多个字W的序列?span class="name">文本也就是文字,字符丌Ӏ说某个字符?span class="name">匚w某个正则表达式,通常是指q个字符串里有一部分Q或几部分分别)能满辑ּl出的条件?/p>
在编写处理字W串的程序或|页Ӟl常会有查找W合某些复杂规则的字W串的需要?span class="name">正则表达?/span>是用于描述q些规则的工兗换句话_正则表达式就是记录文本规则的代码?/p>
很可能你使用qWindows/Dos下用于文件查扄通配W?wildcard)Q也是*?span class="code">?。如果你x找某个目录下的所有的Word文档的话Q你会搜?span style="color: red;">*.doc。在q里Q?span class="code">*会被解释成Q意的字符丌Ӏ和通配W类|正则表达式也是用来进行文本匹配的工具Q只不过比v通配W,它能更精地描述你的需求——当Ӟ代h是更复杂——比如你可以~写一个正则表辑ּQ用来查?span class="desc">所有以0开_后面跟着2-3个数字,然后是一个连字号“-”Q最后是7?位数字的字符?/span>(?span class="string">010-12345678?span class="string">0376-7654321)?/p>
学习正则表达式的最好方法是从例子开始,理解例子之后再自己对例子q行修改Q实验。下面给Z不少单的例子Qƈ对它们作了详l的说明?/p>
假设你在一英文小说里查找hiQ你可以使用正则表达?span class="regex">hi?/p>
q几乎是最单的正则表达式了Q它可以_匚wq样的字W串Q?span class="desc">׃个字W组成,前一个字W是h,后一个是i。通常Q处理正则表辑ּ的工具会提供一个忽略大写的选项Q如果选中了这个选项Q它可以匚whi,HI,Hi,hIq四U情况中的Q意一U?/p>
不幸的是Q很多单词里包含hiq两个连l的字符Q比?span class="string">him,history,high{等。用hi来查扄话,q里边的hi也会被找出来。如果要_地查找hiq个单词的话Q我们应该?span class="regex">\bhi\b?/p>
\b是正则表辑ּ规定的一个特D代码(好吧Q某些h叫它元字W,metacharacterQ,代表着单词的开头或l尾Q也是单词的分界处。虽焉常英文的单词是q|标点W号或者换行来分隔的,但是\bq不匚wq些单词分隔字符中的M一个,?strong>只匹配一个位|?/strong>?/p>
如果需要更_的说法,\b匚wq样的位|:它的前一个字W和后一个字W不全是(一个是,一个不是或不存?\w?/p>
假如你要扄?span class="desc">hi后面不远处跟着一个LucyQ你应该?span class="regex">\bhi\b.*\bLucy\b?/p>
q里Q?span class="part">.是另一个元字符Q匹?span class="desc">除了换行W以外的L字符?span class="part">*同样是元字符Q不q它代表的不是字W,也不是位|,而是数量——它指定*前边的内容可以连l重复出CQ意次以整个表达式得到匹?/span>。因此,.*q在一起就意味着L数量的不包含换行的字W?/span>。现?span class="regex">\bhi\b.*\bLucy\b的意思就很明显了Q?span class="desc">先是一个单词hi,然后是Q意个L字符(但不能是换行)Q最后是Lucyq个单词?/p>
换行W就?\n',ASCII~码?0(十六q制0x0A)的字W?/p>
如果同时使用其它元字W,我们p构造出功能更强大的正则表达式。比如下面这个例子:
0\d\d-\d\d\d\d\d\d\d\d匚wq样的字W串Q?span class="desc">?开_然后是两个数字,然后是一个连字号“-”Q最后是8个数?/span>(也就是中国的电话L。当Ӟq个例子只能匚w区号?位的情Ş)?/p>
q里?span class="part">\d是个新的元字W,匚w一位数?0Q或1Q或2Q或……)?span class="part">-不是元字W,只匹配它本n——连字符或者减受?/p>
Z避免那么多烦人的重复Q我们也可以q样写这个表辑ּQ?span class="regex">0\d{2}-\d{8}?q里\d后面?span class="part">{2}({8})的意思是前面\d必须q箋重复匚w2?8??/p>
其它可用的测试工?
如果你不觉得正则表达式很难读写的话,要么你是一个天才,要么Q你不是地球人。正则表辑ּ的语法很令h头疼Q即使对l常使用它的人来说也是如此。由于难于读写,Ҏ出错Q所以找一U工具对正则表达式进行测试是很有必要的?/p>
׃在不同的环境下正则表辑ּ的一些细节是不相同的Q本教程介绍的是微Y .Net Framework 2.0下正则表辑ּ的行为,所以,我向你介l一?Net下的工具Regex Tester。首先你保已经安装?a title="转到下蝲.Net Framework 2.0的页?>.Net Framework 2.0Q然?a title="从www.unibetter.com下蝲Regex Tester, 75KB">下蝲Regex Tester。这是个l色软gQ下载完后打开压羃?直接q行RegexTester.exe可以了?/p>
下面是Regex Testerq行时的截图Q?/p>
现在你已l知道几个很有用的元字符了,?span class="code">\b,.,*Q还?span class="code">\d.正则表达式里q有更多的元字符Q比?span class="code">\s匚wL的空白符Q包括空|制表W?Tab)Q换行符Q中文全角空格等?span class="code">\w匚w字母或数字或下划U或汉字{?/span>?/p>
对中?汉字的特D处理是?Net提供的正则表辑ּ引擎支持的,其它环境下的具体情况h看相x档?/p>
下面来看看更多的例子Q?/p>
\ba\w*\b匚w以字?span class="part">a开头的单词——先是某个单词开始处(\b)Q然后是字母a,然后是Q意数量的字母或数?\w*)Q最后是单词l束?\b)
好吧Q现在我们说说正则表辑ּ里的单词是什么意思吧Q就是多于一个的q箋?span class="code">\w。不错,q与学习英文时要背的成千上万个同名的东西的确关系不大 :)
\d+匚w1个或更多q箋的数?/span>。这里的+是和*cM的元字符Q不同的?span class="code">*匚w重复L?可能??Q?span class="code">+则匹?span class="desc">重复1ơ或更多?/span>?/p>
\b\w{6}\b 匚w刚好6个字?数字的单?/span>?/p>
元字W?span class="code">^
代码
说明
.
匚w除换行符以外的Q意字W?/span>
\w
匚w字母或数字或下划U或汉字
\s
匚wL的空白符
\d
匚w数字
\b
匚w单词的开始或l束
^
匚w字符串的开?/span>
$
匚w字符串的l束
q里?span class="part">{5,12}和前面介l过?span class="part">{2}是类似的Q只不过{2}匚w只能不多不少重复2?/span>Q?span class="part">{5,12}则是重复的次C能少?ơ,不能多于12?/span>Q否则都不匹配?/p>
因ؓ使用?span class="part">^ 和忽略大写的选项cMQ有些正则表辑ּ处理工具q有一个处理多行的选项。如果选中了这个选项Q?span class="code">^
如果你想查找元字W本w的话,比如你查?span class="desc">.,或?span class="desc">*,出C问题Q你没办法指定它们,因ؓ它们会被解释成别的意思。这时你得使用\来取消这些字W的Ҏ意义。因此,你应该?span class="regex">\.?span class="regex">\*。当Ӟ要查?span class="desc">\本nQ你也得?span class="regex">\\.
例如Q?span class="regex">unibetter\.com匚wunibetter.comQ?span class="regex">C:\\Windows匚wC:\Windows?/p>
你已l看q了前面?span class="code">*,+,{2},{5,12}q几个匹配重复的方式了。下面是正则表达式中所有的限定W?指定数量的代码,例如*,{5,12}{?Q?/p>
代码/语法 | 说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一ơ或更多?/span> |
? | 重复零次或一?/span> |
{n} | 重复n?/span> |
{n,} | 重复nơ或更多?/span> |
{n,m} | 重复n到m?/span> |
下面是一些用重复的例子Q?/p>
Windows\d+匚wWindows后面?个或更多数字
^\w+匚w一行的W一个单?或整个字W串的第一个单词,具体匚w哪个意思得看选项讄)
要想查找数字Q字母或数字Q空白是很简单的Q因为已l有了对应这些字W集合的元字W,但是如果你想匚w没有预定义元字符的字W集?比如元音字母a,e,i,o,u),应该怎么办?
很简单,你只需要在Ҏ号里列出它们p了,?span class="regex">[aeiou]匹?span class="desc">M一个英文元韛_?/span>Q?span class="regex">[.?!]匚w标点W号(.??)?/p>
我们也可以轻村֜指定一个字W?span class="name">范围Q像[0-9]代表的含意与\d是完全一致的Q?span class="desc">一位数?/span>Q同?span class="regex">[a-z0-9A-Z_]也完全等同于\wQ如果只考虑英文的话Q?/p>
下面是一个更复杂的表辑ּQ?span class="regex">\(?0\d{2}[) -]?\d{8}?/p>
“(”?#8220;)”也是元字W,后面?a >分组?/font>里会提到Q所以在q里需要?a >转义?/p>
q个表达式可以匹?span class="desc">几种格式的电话号?/span>Q像(010)88886666Q或022-22334455Q或02912345678{。我们对它进行一些分析吧Q首先是一个{义字W?span class="part">\(,它能出现0ơ或1??),然后是一?span class="part">0Q后面跟着2个数?\d{2})Q然后是)?span class="part">-?span class="part">I格中的一个,它出?ơ或不出??)Q最后是8个数?\d{8})?/p>
不幸的是Q刚才那个表辑ּ也能匚w010)12345678?span class="string">(022-87654321q样?#8220;不正?#8221;的格式。要解决q个问题Q我们需要用?span class="name">分枝条g。正则表辑ּ里的分枝条g指的是有几种规则Q如果满_中Q意一U规则都应该当成匚wQ具体方法是?span class="code">|把不同的规则分隔开。听不明白?没关p,看例子:
0\d{2}-\d{8}|0\d{3}-\d{7}q个表达式能匚w两种以连字号分隔的电话号码:一U是三位区号Q?位本地号(?10-12345678)Q一U是4位区P7位本地号(0376-2233445)?/p>
\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}q个表达?span class="desc">匚w3位区L电话LQ其中区号可以用括hhQ也可以不用Q区号与本地号间可以用连字号或空格间隔,也可以没有间?/span>。你可以试试用分枝条件把q个表达式扩展成也支?位区L?/p>
\d{5}-\d{4}|\d{5}q个表达式用于匹配美国的邮政~码。美国邮~的规则?位数字,或者用q字号间隔的9位数字。之所以要l出q个例子是因为它能说明一个问题:使用分枝条gӞ要注意各个条件的序。如果你把它Ҏ\d{5}|\d{5}-\d{4}的话Q那么就只会匚w5位的邮编(以及9位邮~的??。原因是匚w分枝条gӞ会从左到右地测试每个条Ӟ如果满了某个分枝的话,׃会去再管其它的条件了?/p>
我们已经提到了怎么重复单个字符Q直接在字符后面加上限定W就行了Q;但如果想要重复多个字W又该怎么办?你可以用括h指定子表辑ּ(也叫?span class="name">分组)Q然后你可以指定这个子表达式的重复ơ数了,你也可以对子表达式进行其它一些操?后面会有介绍)?/p>
(\d{1,3}\.){3}\d{1,3}是一?span class="desc">单的IP地址匚w表达式。要理解q个表达式,h下列序分析它:\d{1,3}匚w1?位的数字Q?span class="part">(\d{1,3}\.){3}匚w三位数字加上一个英文句?q个整体也就是这?span class="name">分组)重复3?/span>Q最后再加上一个一C位的数字(\d{1,3})?/p>
IP地址中每个数字都不能大于255Q大家千万不要被?4》第三季的编剧给忽悠?..
不幸的是Q它也将匚w256.300.888.999q种不可能存在的IP地址。如果能使用术比较的话Q或许能单地解决q个问题Q但是正则表辑ּ中ƈ不提供关于数学的M功能Q所以只能用冗长的分组Q选择Q字W类来描qC个正的IP地址Q?span class="regex">((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)?/p>
理解q个表达式的关键是理?span class="part">2[0-4]\d|25[0-5]|[01]?\d\d?Q这里我׃l说了,你自己应该能分析得出来它的意义?/p>
有时需要查找不属于某个能简单定义的字符cȝ字符。比如想查找除了数字以外Q其它Q意字W都行的情况Q这旉要用?span class="name">反义Q?/p>
代码/语法 | 说明 |
---|---|
\W | 匚wL不是字母Q数字,下划U,汉字的字W?/span> |
\S | 匚wL不是I白W的字符 |
\D | 匚wL非数字的字符 |
\B | 匚w不是单词开头或l束的位|?/span> |
[^x] | 匚w除了x以外的Q意字W?/span> |
[^aeiou] | 匚w除了aeiouq几个字母以外的L字符 |
例子Q?span class="regex">\S+匚w不包含空白符的字W串?/p>
<a[^>]+>匚w用尖括号括v来的以a开头的字符?/span>?/p>
使用括h定一个子表达式后Q?strong>匚wq个子表辑ּ的文?/strong>(也就是此分组捕获的内?可以在表辑ּ或其它程序中作进一步的处理。默认情况下Q每个分l会自动拥有一?span class="name">l号后向引用
后向引用用于重复搜烦前面某个分组匚w的文本。例如,\1代表分组1匚w的文?/span>。难以理解?LCZQ?/p>
\b(\w+)\b\s+\1\b可以用来匚w重复的单?/span>Q像go go, 或?span class="string">kitty kitty。这个表辑ּ首先?span class="desc">一个单?/span>Q也是单词开始处和结束处之间的多于一个的字母或数?/span>(\b(\w+)\b)Q这个单词会被捕获到~号?的分l中Q然后是1个或几个I白W?/span>(\s+)Q最后是分组1中捕L内容Q也是前面匚w的那个单词)(\1)?/p>
你也可以自己指定子表辑ּ?span class="name">l名
使用括L时候,q有很多特定用途的语法。下面列Z最常用的一些:
分类 | 代码/语法 | 说明 |
---|---|---|
捕获 | (exp) | 匚wexp,q捕h本到自动命名的组?/span> |
(?<name>exp) | 匚wexp,q捕h本到名称为name的组里,也可以写??'name'exp) | |
(?:exp) | 匚wexp,不捕获匹配的文本Q也不给此分l分配组?/span> | |
零宽断言 | (?=exp) | 匚wexp前面的位|?/span> |
(?<=exp) | 匚wexp后面的位|?/span> | |
(?!exp) | 匚w后面跟的不是exp的位|?/span> | |
(?<!exp) | 匚w前面不是exp的位|?/span> | |
注释 | (?#comment) | q种cd的分l不Ҏ则表辑ּ的处理生Q何媄响,用于提供注释让h阅读 |
我们已经讨论了前两种语法。第三个(?:exp)不会改变正则表达式的处理方式Q只是这Ll匹配的内容不会像前两种那样被捕获到某个l里面,也不会拥有组?/span>?/p>
地球人,是不是觉得这些术语名U太复杂Q太难记了?我也和你一栗知道有q么一U东西就行了Q它叫什么,随它dQ?#8220;无名Q万物之?..” 接下来的四个用于查找在某些内?但ƈ不包括这些内?之前或之后的东西Q也是说它们像\b,^,$那样用于指定一个位|,q个位置应该满一定的条g(xa)Q因此它们也被称?span class="name">零宽断言零宽断言
断言用来声明一个应该ؓ真的事实。正则表辑ּ中只有当断言为真时才会l进行匹配?/p>
(?=exp)也叫零宽度正预测先行断言Q它断言自n出现的位|的后面能匹配表辑ּexp。比?span class="regex">\b\w+(?=ing\b)Q匹?span class="desc">以ingl尾的单词的前面部分(除了ing以外的部?Q如查找I'm singing while you're dancing.Ӟ它会匚wsing?span class="desc">danc?/p>
(?<=exp)也叫零宽度正回顾后发断言Q它断言自n出现的位|的前面能匹配表辑ּexp。比?span class="regex">(?<=\bre)\w+\b会匹?span class="desc">以re开头的单词的后半部?除了re以外的部?Q例如在查找reading a bookӞ它匹?span class="desc">ading?/p>
假如你想要给一个很长的数字中每三位间加一个逗号(当然是从双加v?Q你可以q样查找需要在前面和里面添加逗号的部分:((?<=\d)\d{3})*\bQ用它对1234567890q行查找时结果是234567890?/p>
下面q个例子同时使用了这两种断言Q?span class="regex">(?<=\s)\d+(?=\s)匚w以空白符间隔的数?再次Q不包括q些I白W??/p>
前面我们提到q怎么查找不是某个字符或不在某个字W类?/strong>的字W的Ҏ(反义)。但是如果我们只是想?strong>保某个字符没有出现Q但q不惛_匚w?/strong>时怎么办?例如Q如果我们想查找q样的单?-它里面出C字母q,但是q后面跟的不是字母u,我们可以试q样Q?/p>
\b\w*q[^u]\w*\b匚w包含后面不是字母u的字母q的单?/span>。但是如果多做测?或者你思维_敏锐Q直接就观察出来?Q你会发玎ͼ如果q出现在单词的l尾的话Q像Iraq,BenqQ这个表辑ּ׃出错。这是因?span class="part">[^u]总要匚w一个字W,所以如果q是单词的最后一个字W的话,后面?span class="part">[^u]会匚wq后面的单词分隔符(可能是空|或者是句号或其它的什?Q后面的\w*\b会匚w下一个单词,于是\b\w*q[^u]\w*\bp匚w整个Iraq fighting?span class="name">负向零宽断言能解册L问题Q因为它只匹配一个位|,q不消费M字符。现在,我们可以q样来解册个问题:\b\w*q(?!u)\w*\b?/p>
零宽度负预测先行断言(?!exp)Q?span class="desc">断言此位|的后面不能匚w表达式exp。例如:\d{3}(?!\d)匚w三位数字Q而且q三位数字的后面不能是数?/span>Q?span class="regex">\b((?!abc)\w)+\b匚w不包含连l字W串abc的单?/span>?/p>
同理Q我们可以用(?<!exp),零宽度正回顾后发断言?span class="desc">断言此位|的前面不能匚w表达式exp 误l分析表辑ּ(?<=<(\w+)>).*(?=<\/\1>)Q这个表辑ּ最能表现零宽断a的真正用途?/p>
一个更复杂的例子:(?<=<(\w+)>).*(?=<\/\1>)匚w不包含属性的单HTML标签内里的内?/span>?span class="code">(<?(\w+)>)指定了这L前缀Q?span class="desc">被尖括号括v来的单词 括L另一U用途是通过语法(?#comment)来包含注释。例如:2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)?/p>
要包含注释的话,最好是启用“忽略模式里的I白W?#8221;选项Q这样在~写表达式时能Q意的dI格QTabQ换行,而实际用时q些都将被忽略。启用这个选项后,?后面到这一行结束的所有文本都被当成注释忽略掉。例如,我们可以前面的一个表辑ּ写成q样Q?/p>
当正则表辑ּ中包含能接受重复的限定符Ӟ通常的行为是Q在使整个表辑ּ能得到匹配的前提下)匚w可能多的字W。考虑q个表达式:a.*bQ它会匚w最长的以a开始,以bl束的字W串。如果用它来搜烦aabab的话Q它会匹配整个字W串aabab。这被称?span class="name">贪婪匚w?/p>
有时Q我们更需?span class="name">懒惰匚wQ也是匚w可能少的字W。前面给出的限定W都可以被{化ؓ懒惰匚w模式Q只要在它后面加上一个问?span class="code">?。这?span class="regex">.*?意味着匚wL数量的重复,但是在能使整个匹配成功的前提下用最的重复。现在看看懒惰版的例子吧Q?/p>
a.*?b匚w最短的Q以a开始,以bl束的字W串。如果把它应用于aabab的话Q它会匹?span class="desc">aabQ第一到第三个字符Q?/span>?span class="desc">abQ第四到W五个字W)?/p>
Z么第一个匹配是aabQ第一到第三个字符Q而不是abQ第二到W三个字W)Q简单地_因ؓ正则表达式有另一条规则,比懒惎ͼ贪婪规则的优先更高Q最先开始的匚w拥有最高的优先权——The match that begins earliest wins?/p>
在C#中,你可以?a title="MSDN 相关文档">Regex(String, RegexOptions)构造函?/font>来设|正则表辑ּ的处理选项。如QRegex regex = new Regex("\ba\w{6}\b", RegexOptions.IgnoreCase); 上面介绍了几个选项如忽略大写Q处理多行等Q这些选项能用来改变处理正则表辑ּ的方式。下面是.Net中常用的正则表达式选项Q?/p>
一个经常被问到的问题是Q是不是只能同时使用多行模式和单行模式中的一U?{案是:不是。这两个选项之间没有M关系Q除了它们的名字比较怼Q以至于让h感到疑惑Q以外?/p>
q里介绍的^衡组语法是由.Net Framework支持的;其它语言Q库不一定支持这U功能,或者支持此功能但需要用不同的语法?/p>
有时我们需要匹配像( 100 * ( 50 + 15 ) )q样的可嵌套的层ơ性结?/span>Q这时简单地使用\(.+\)则只会匹配到最左边的左括号和最双的右括号之间的内?q里我们讨论的是贪婪模式Q懒惰模式也有下面的问题)。假如原来的字符串里的左括号和右括号出现的次C相等Q比?span class="string">( 5 / ( 3 + 2 ) ) )Q那我们的匹配结果里两者的个数也不会相{。有没有办法在这L字符串里匚w到最长的Q配对的括号之间的内容呢Q?/p>
Z避免(?span class="code">\(把你的大脑彻底搞p涂Q我们还是用括号代替圆括号吧。现在我们的问题变成了如何把xx <aa <bbb> <bbb> aa> yyq样的字W串里,最长的配对的尖括号内的内容捕获出来Q?/p>
q里需要用C下的语法构造: 如果你不是一个程序员Q或者你自称E序员但是不知道堆栈是什么东西)Q你pL解上面的三种语法吧:W一个就是在黑板
上写一?group"Q第二个是从黑板上擦掉一?group"Q第三个是看黑板上写的q有没有"group"Q如果有ql匹配yes部分Q否?
匹配no部分?/p>
我们需要做的是每碰C左括P在压入一?Open",每碰C个右括号Q就弹出一个,C最后就看看堆栈是否为空Q-如果不ؓI那p明左括号比右括号多,那匹配就应该p|。正则表辑ּ引擎会进行回?攑ּ最前面或最后面的一些字W?Q尽量整个表达式得到匹配?/p>
ql的一个最常见的应用就是匹配HTML,下面q个例子可以匚w嵌套?lt;div>标签Q?span class="regex"><div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div>. 我已l描qC构造正则表辑ּ的大量元素,q有一些我没有提到的东ѝ下面是未提到的元素的列表,包含语法和简单的说明。你可以在网上找到更详细的参
考资料来学习它们--当你需要用到它们的时候。如果你安装了MSDN Library,你也可以在里面找到关?net下正则表辑ּ详细的文档?/p>
好吧,我承?我骗了你,dq里你肯定花了不?0分钟.怿?q是我的?而不是因Z太笨.我之所以说"30分钟",是ؓ了让你有信心,有耐心l箋下去.既然你看Cq里,那证明我的阴谋成功了.被忽悠的感觉很爽吧? 要投诉我,或者觉得我其实可以做得更好,或者有M其它问题,Ƣ迎?a >我的博客让我知道.注释
(?<= # 断言要匹配的文本的前~
<(\w+)> # 查找括hh的字母或数字(即HTML/XML标签)
) # 前缀l束
.* # 匚wL文本
(?= # 断言要匹配的文本的后~
<\/\1> # 查找括hh的内容:前面是一?/"Q后面是先前捕获的标{?br> ) # 后缀l束贪婪与懒?/h2>
代码/语法
说明
*?
重复Lơ,但尽可能重?/span>
+?
重复1ơ或更多ơ,但尽可能重?/span>
??
重复0ơ或1ơ,但尽可能重?/span>
{n,m}?
重复n到mơ,但尽可能重?/span>
{n,}?
重复nơ以上,但尽可能重?/span>
处理选项
名称
说明
IgnoreCase(忽略大小?
匚w时不区分大小写?/td>
Multiline(多行模式)
更改^?span class="code">$的含义,使它们分别在L一行的行首和行配,而不仅仅在整个字W串的开头和l尾匚w?在此模式?$的精含意是:匚w\n之前的位|以及字W串l束前的位置.)
Singleline(单行模式)
更改.的含义,使它与每一个字W匹配(包括换行W\nQ?
IgnorePatternWhitespace(忽略I白)
忽略表达式中的非转义I白q启用由#标记的注释?/td>
RightToLeft(从右向左查找)
匚w从右向左而不是从左向双行?/td>
ExplicitCapture(昑ּ捕获)
仅捕获已被显式命名的l?/td>
ECMAScript(JavaScript兼容模式)
使表辑ּ的行Z它在JavaScript里的行ؓ一致?/td>
ql?递归匚w
< #最外层的左括号
[^<>]* #最外层的左括号后面的不是括L内容
(
(
(?'Open'<) #到了左括号Q在黑板上写一?Open"
[^<>]* #匚w左括号后面的不是括号的内?br> )+
(
(?'-Open'>) #到了右括号Q擦掉一?Open"
[^<>]* #匚wx号后面不是括L内容
)+
)*
(?(Open)(?!)) #在遇到最外层的右括号前面Q判断黑板上q有没有没擦掉的"Open"Q如果还有,则匹配失?br>> #最外层的右括号q有些什么东西没提到
代码/语法
说明
\a
报警字符(打印它的效果是电脑嘀一?
\b
通常是单词分界位|,但如果在字符c里使用代表退?/span>
\t
制表W,Tab
\r
回R
\v
竖向制表W?/span>
\f
换页W?/span>
\n
换行W?/span>
\e
Escape
\0nn
ASCII代码中八q制代码为nn的字W?/span>
\xnn
ASCII代码中十六进制代码ؓnn的字W?/span>
\unnnn
Unicode代码中十六进制代码ؓnnnn的字W?/span>
\cN
ASCII控制字符。比如\cC代表Ctrl+C
\A
字符串开?cM^Q但不受处理多行选项的媄?
\Z
字符串结或行尾(不受处理多行选项的媄?
\z
字符串结?cM$Q但不受处理多行选项的媄?
\G
当前搜烦的开?/span>
\p{name}
Unicode中命名ؓname的字W类Q例如\p{IsGreek}
(?>exp)
贪婪子表辑ּ
(?<x>-<y>exp)
ql?/span>
(?im-nsx:exp)
在子表达式exp中改变处理选项
(?im-nsx)
辑ּ后面的部分改变处理选项
(?(exp)yes|no)
把exp当作零宽正向先行断言Q如果在q个位置能匹配,使用yes作ؓ此组的表辑ּQ否则用no
(?(exp)yes)
同上Q只是用空表达式作为no
(?(name)yes|no)
如果命名为name的组捕获C内容Q用yes作ؓ表达式;否则使用no
(?(name)yes)
同上Q只是用空表达式作为no
联系作?/h2>
]]>
Nokia today announced that its Qt cross-platform user interface (UI) and application framework for desktop and embedded platforms will be available under the open source LGPL version 2.1 license from the release of Qt 4.5, scheduled for March 2009. In addition:
We have some exciting news we’d like to share with the free software community: Qt will be licensed under the terms of the LGPL version 2.1 with the upcoming Qt 4.5 release, in addition to our standard GPL and commercial licenses. We are also pleased to announce that we are going to open up the Qt source code repository and also make it easier for the community to contribute to Qt.
Adding LGPL version 2.1 will greatly increase adoption of Qt across Windows, Linux, embedded Linux, Mac, S60, Windows CE, maemo, and Ovi web services. Having a larger number of users, including Nokia developers, providing feedback and contributions will help Qt remain a cutting edge, robust UI and application framework.
Going forward we will speed up the development of Qt using additional resources and work in even closer cooperation with the free software community. We will do this in a number of ways, including:
As we know that license versions are important for many in the free software community, we wanted to also take the opportunity to provide some highlights of our upcoming changes:
As a first step we have selected LGPL version 2.1 as this is the version of the LGPL that best fits our purposes and we are most comfortable with at this point in time. We will continue to evaluate the adoption, use and legal interpretation of LGPL version 3 by the community and may use this version of the LGPL for future releases.
Finally, we will open the Qt repositories and provide more information regarding how interested parties can contribute to Qt with the release of Qt 4.5, which is scheduled for March. Until then, if you have any questions, please feel free to post your questions below.
Sincerely,
Sebastian Nyström
Vice President, Qt Software