笔记:如何写出高效率的正则表达式
Nov 30th
如果纯粹是为了挑战自己的正则水平,用来实现一些特效(例如使用正则表达式计算质数、解线性方程),效率不是问题;如果所写的正则表达式只是为了满足一两次、几十次的运行,优化与否区别也不太大。但是,如果所写的正则表达式会百万次、千万次地运行,效率就是很大的问题了。我这里总结了几条提升正则表达式运行效率的经验(工作中学到的,看书学来的,自己的体会),贴在这里。如果您有其它的经验而这里没有提及,欢迎赐教。
为行文方便,先定义两个概念。
- 误匹配:指正则表达式所匹配的内容范围超出了所需要范围,有些文本明明不符合要求,但是被所写的正则式“击中了”。例如,如果使用\d{11}来匹配11位的手机号,\d{11}不单能匹配正确的手机号,它还会匹配98765432100这样的明显不是手机号的字符串。我们把这样的匹配称之为误匹配。
- 漏匹配:指正则表达式所匹配的内容所规定的范围太狭窄,有些文本确实是所需要的,但是所写的正则没有将这种情况囊括在内。例如,使用\d{18}来匹配18位的身份证号码,就会漏掉结尾是字母X的情况。
写出一条正则表达式,既可能只出现误匹配(条件写得极宽松,其范围大于目标文本),也可能只出现漏匹配(只描述了目标文本中多种情况种的一种),还可能既有误匹配又有漏匹配。例如,使用\w+\.com来匹配.com结尾的域名,既会误匹配abc_.com这样的字串(合法的域名中不含下划线,\w包含了下划线这种情况),又会漏掉ab-c.com这样的域名(合法域名中可以含中划线,但是\w不匹配中划线)。
精准的正则表达式意味着既无误匹配且无漏匹配。当然,现实中存在这样的情况:只能看到有限数量的文本,根据这些文本写规则,但是这些规则将会用到海量的文本中。这种情况下,尽可能地(如果不是完全地)消除误匹配以及漏匹配,并提升运行效率,就是我们的目标。本文所提出的经验,主要是针对这种情况。
- 掌握语法细节。正则表达式在各种语言中,其语法大致相同,细节各有千秋。明确所使用语言的正则的语法的细节,是写出正确、高效正则表达式的基础。例如,perl中与\w等效的匹配范围是[a-zA-Z0-9_];perl正则式不支持肯定逆序环视中使用可变的重复(variable repetition inside lookbehind,例如(?<=.*)abc),但是.Net语法是支持这一特性的;又如,JavaScript连逆序环视(Lookbehind,如(?<=ab)c)都不支持,而perl和python是支持的。《精通正则表达式》第3章《正则表达式的特性和流派概览》明确地列出了各大派系正则的异同,这篇文章也简要地列出了几种常用语言、工具中正则的比较。对于具体使用者而言,至少应该详细了解正在使用的那种工作语言里正则的语法细节。
- 先粗后精,先加后减。使用正则表达式语法对于目标文本进行描述和界定,可以像画素描一样,先大致勾勒出框架,再逐步在局步实现细节。仍举刚才的手机号的例子,先界定\d{11},总不会错;再细化为1[358]\d{9},就向前迈了一大步(至于第二位是不是3、5、8,这里无意深究,只举这样一个例子,说明逐步细化的过程)。这样做的目的是先消除漏匹配(刚开始先尽可能多地匹配,做加法),然后再一点一点地消除误匹配(做减法)。这样有先有后,在考虑时才不易出错,从而向“不误不漏”这个目标迈进。
- 留有余地。所能看到的文本sample是有限的,而待匹配检验的文本是海量的,暂时不可见的。对于这样的情况,在写正则表达式时要跳出所能见到的文本的圈子,开拓思路,作出“战略性前瞻”。例如,经常收到这样的垃圾短信:“发*票”、“发#漂”。如果要写规则屏蔽这样烦人的垃圾短信,不但要能写出可以匹配当前文本的正则表达式 发[*#](?:票|漂),还要能够想到 发.(?:票|漂|飘)之类可能出现的“变种”。这在具体的领域或许会有针对性的规则,不多言。这样做的目的是消除漏匹配,延长正则表达式的生命周期。
- 明确。具体说来,就是谨慎用点号这样的元字符,尽可能不用星号和加号这样的任意量词。只要能确定范围的,例如\w,就不要用点号;只要能够预测重复次数的,就不要用任意量词。例如,写析取twitter消息的脚本,假设一条消息的xml正文部分结构是<span class=”msg”>…</span>且正文中无尖括号,那么<span class=”msg”>[^<]{1,480}</span>这种写法的思路要好于<span class=”msg”>.*</span>,原因有二:一是使用[^<],它保证了文本的范围不会超出下一个小于号所在的位置;二是明确长度范围,{1,480},其依据是一条twitter消息大致能的字符长度范围。当然,480这个长度是否正确还可推敲,但是这种思路是值得借鉴的。说得狠一点,“滥用点号、星号和加号是不环保、不负责任的做法”。
- 不要让稻草压死骆驼。每使用一个普通括号()而不是非捕获型括号(?:…),就会保留一部分内存等着你再次访问。这样的正则表达式、无限次地运行次数,无异于一根根稻草的堆加,终于能将骆驼压死。养成合理使用(?:…)括号的习惯。
- 宁简勿繁。将一条复杂的正则表达式拆分为两条或多条简单的正则表达式,编程难度会降低,运行效率会提升。例如用来消除行首和行尾空白字符的正则表达式s/^\s+|\s+$//g;,其运行效率理论上要低于s/^\s+//g; s/\s+$//g; 。这个例子出自《精通正则表达式》第五章,书中对它的评论是“它几乎总是最快的,而且显然最容易理解”。既快又容易理解,何乐而不为?工作中我们还有其它的理由要将C==(A|B)这样的正则表达式拆为A和B两条表达式分别执行。例如,虽然A和B这两种情况只要有一种能够击中所需要的文本模式就会成功匹配,但是如果只要有一条子表达式(例如A)会产生误匹配,那么不论其它的子表达式(例如B)效率如何之高,范围如何精准,C的总体精准度也会因A而受到影响。
- 巧妙定位。有时候,我们需要匹配的the,是作为单词的the(两边有空格),而不是作为单词一部分的t-h-e的有序排列(例如together中的the)。在适当的时候用上^,$,\b等等定位锚点,能有效提升找到成功匹配、淘汰不成功匹配的效率。
总结完发现,《精通正则表达式》的第5章、第6章已经以更为有条理的方式总结出了常用的优化方法。不过,泛泛地读过的印象是肤浅的,过后即忘的;而真正若有所悟时在书上得到了系统地印证,这种感觉才是真的爽。
正则杂谈:从“评论已关闭”到正则表达式之眼
May 27th
近来沸沸扬扬地一条饭否消息是评论已关闭,这个关键词真的选的很好,它一下子把所有的一类敏感问题都串起来了,找到了该类问题的共同特征。至于为什么关闭评论,关闭的标准是什么,这里都不做探讨,只是从正则角度谈论一下技术而已。
所谓正则表达式,其实是一种抽象,是从现有的文本中找到规律,然后用正则的语言描述出来。例如,上次有人问,以http开头的,以空格结尾的正则式如何写?这个问题不难,我们只要符合这两个要求即可,即^(http\S+)\s。至于http后面的冒号、双斜杠,都不必劳神去匹配。这样写出来的正则表达式简洁明快,清晰易读。当然,从效率出发,越精确的正则式越有利于尽早失败,有利于提升效率。权衡写的效率与执行的效率,其过程也是很不错的。
Windows下的正则表达式工具之五——经典的Regulator
Dec 17th
本文介绍的the Regulator 2.0 与上一篇文章介绍的Expresso一样,都是颇有年头的软件:Expresso的最后更新日期似乎是2007年6月30日;the Regulator 2.0的上次更新,更是可追溯到2004年。可是,在没有RegexBuddy的日子里,the Regulator 可算是元老呢!MSDN上有篇文章《Ten Must-Have Tools Every Developer Should Download Now》,介绍了开发者必备的10款工具之一就有the Regulator。作者Roy Osherove在regulator的帮助文件中说,自己的Regulator的创意就来自于Expresso。
Regulator的界面,比Expresso要新潮,与以前介绍过的Mtracer有几分相像。 Read the rest of this entry »
饭否消息解析之从minidom到xpath
Oct 14th
抛板砖,引白玉:为何不用xpath,什么是xpath?
最近拾起了以前的小项目,在完善上篇文章发布后,“那个谁”的回复让我很感兴趣。他问,“为什么不用xpath?”
xpath是什么东东?我反问。反问之前,当然少不了先google一番,以免……那个啥。
Read the rest of this entry »
饭否消息析取之regex vs xml
Oct 8th
页内导航:
批量导出饭否程序的方法很多,但是基本思路都是先将该网页保存到本地,然后将有用的饭否消息析取出来。本文不讨论如何下载饭否网页了(使用迅雷、wget、curl等),重点讨论对于下载到本地的网页,如何将有用的饭否消息析取出来。
探索匹配中文的正则表达式
Aug 24th
按:本文使用的RegexBuddy为3.1.0(完全)版,并非最新版3.1.1(截至2008.08.23)。需要该版本的请在这篇文章后留言。
注:参考www.regular-expressions.info的风格,更新了本模板的style.css文件,加入了与正则式代码相关的格式:
- 正则式格式举例:[a-z]+@[a-z]+?\.[a-z]+
- 匹配格式举例:pig@animals.com和chicken@birds.com
- 普通文本格式举例:这是一些普通文本。hello regex world. pig@animals.com和chicken@birds.com
《精通正则表达式》视频教程提供下载
Aug 17th
偶然从网上找到该教程,下载后觉得不错,可以作为《精通正则表达式》的番外篇,共同学习。
关于此视频的讲师:
此视频的讲师为余晟先生。余先生是抓虾网高级顾问。毕业于东北师范大学,主修计算机,辅修中文。现居北京。曾任高级程序员、技术经理;从事过大量文本解析和数据抽取的工作。对程序语言、算法、数据库和敏捷开发都有兴趣,译有《精通正则表达式》(第3版)一书。
关于此视频
此视频分为5讲,每讲30分钟左右,内容深入浅出,适合以下受众:
- 对正则式感兴趣的人;
- 对正则式不感兴趣的人;
- 正则式初学者,想入门;
- 正则式有所成者,想提高。
当然,如果能静下心来,通读《精通正则表达式》原书,并亲自动手尝试,效果更为显著。 Read the rest of this entry »
匹配中文的正则表达式
Jun 2nd
以前在编写linux下的scim郑码码表时,就跟正则式的中文匹配问题打过交道。当时总结了这样一条经验,utf8编码格式下,中文正则式应该这样书写:
[\x80-\xff]{3}
当然,这与语言无关。在perl与python中,都是一样的。
现在,这条正则式又派上用场了。正在编写的一个小程序MiniBlogs Updater中,需要计算用户所输入的文字字数。因为中英文字符编码长度不一,如果直接使用python中的len()函数,它计算的是该字串的实际长度,一个中文字并非等同于一个英文字母的。因此,需要把中文字当成英文字母来处理。
我写了这样一条语句来处理:
length=len(re.sub('[\x80-\xff]{3}','a',msg))
它的意思是,把所有的中文都替换成英文字母a,然后再统计字数。(只是统计而已,不修改源字串。)这条语句在windows下utf8文件中能够正常工作。
再分享两则与匹配中文的正则表达式有用的链接:
饭否私信格式分析
May 31st
URL
饭否私信分为两种,一种是我收到的私信,一种是我发出的私信。
- 我收到的私信:http://fanfou.com/privatemsg/p.(1-N)
- 我发出的私信:http://fanfou.com/privatemsg/sent/p.(1-N)
上面的地址中不含饭否ID;需要cookie验证。
结束标志
通过cookie验证后,可以使用数字获得对应页码的私信内容。什么时候是结束呢?假如您的收件箱有1000条私信,每页显示20条,那么当你您输入http://fanfou.com/privatemsg/p.51时,就得不到任何有效的内容了。作为程序,它是寻找如下标志:
<ol class="wa">\s*</ol>
好友列表
在页面代码中,每页都有一个“向XXX发送私信”的combox列表,条目以昵称+ID组成。如果你的好友很多的话(500+),每条好友(昵称+ID)需要20字节(估算)的话,20*500=10K,大约需要多抓取10K的字节量。
收件箱饭否私信的结构
收到的私信分为两种,一种是有回复信息的(回复原文:…),一种是没有回复的。先从简单的入手,看没有回复的。
所有的私信都在<ol class=”wa”>…</ol>之内,以<li></li>分隔
例如下面这一条,就是一则很规范的私信(与发件人相关的信息都使以正则式表示):
<li> <a href="/[^"]+" title="[^"]+" class="avatar"><img src="[^"]+" alt="[^"]+" /></a> 来自<a href="[^"]+">[^"]+</a>: <span class="content">没法比较啊,你得说个具体的值,比如100条以下的算少,1000条以上的算多……</span> <span class="stamp time" title="2008-05-30 17:25">约 15 小时前</span> <span class="op"> <a href="/privatemsg.reply/583520">回复</a> <a href="/privatemsg.del/583520" class="post_act">删除</a></span> </li>
其中,需要记录的信息有:
- 发件人名字;
- 发件人ID;
- 私信内容;
- 时间;
- 私信ID;(便于作删除、回复处理)。
根据以上需求,将上面的私信代码作处理:
<li> <a href="/([^"]+)" title="([^"]+)" class="avatar"><img src="[^"]+" alt="[^"]+" /></a> 来自<a href="[^"]+">[^"]+</a>: <span class="content">([^<]+)</span> <span class="stamp time" title="([^"]+)">[^<]+</span> <span class="op"> <a href="/privatemsg.reply/(\d+)">回复</a> <a href="/privatemsg.del/\d+" class="post_act">删除</a> </span> </li>
从而得到:
$1=fanfou ID; $2=fanfou name; $3=private msg; $4=msg time; $5=msg ID;
再看一下包含“回复原文”的私信的结构(部分内容已作正则处理):
<li> <a href="/([^"]+)" title="([^"]+)" class="avatar"><img src="[^"]+" alt="[^"]+" /></a> 来自<a href="[^"]+">[^"]+</a>: <span class="content">([^<]+)</span> <span class="stamp time" title="([^"]+)">[^<]+</span> <span class="op"> <a href="/privatemsg.reply/(\d+)">回复</a> <a href="/privatemsg.del/\d+" class="post_act">删除</a> </span> <p class="pm-parent">回复原文: 有兴趣就有动力</p> </li>
与前者相比,只是多了<p class=”pm-parent”>.*?</p>这一段。这是不足为虑的。只要整体加上?这个强有力的正则符号,就能与上面的代码片段归纳到一起。两者结合合的代码如下:
<li> <a href="/([^"]+)" title="([^"]+)" class="avatar"><img src="[^"]+" alt="[^"]+" /></a> 来自<a href="[^"]+">[^"]+</a>: <span class="content">([^<]+)</span> <span class="stamp time" title="([^"]+)">[^<]+</span> <span class="op"> <a href="/privatemsg.reply/(\d+)">回复</a> <a href="/privatemsg.del/\d+" class="post_act">删除</a></span> (?:<p class="pm-parent">([^<]+)</p>)? </li>
得到的变量为:
$1=fanfou ID; $2=fanfou name; $3=private msg; $4=msg time; $5=msg ID; $6=parent msg;#回复原文。
发件箱饭否私信的结构
抄代码:
<li> <a href="/([^"]+)" title="([^"]+)" class="avatar"><img src="[^"]+" alt="[^"]+" /></a> 发给<a href="[^"]+">[^"]+</a>: <span class="content">海内的像片是真的。</span> <span class="stamp time" title="2008-05-28 20:24">2008-05-28 20:24</span> <span class="op"><a href="/privatemsg.del/576827" class="post_act">删除</a></span> </li>
这与“我收到的私信”的结构完全一致,只是将原来的“来自”改为“发给”而已。
不出意外,带有“回复原文”的“我收到的私信”的结构是这样的:
<li> <a href="/([^"]+)" title="([^"]+)" class="avatar"><img src="[^"]+" alt="[^"]+" /></a> 发给<a href="[^"]+">[^"]+</a>: <span class="content">在自述部分显示的那个网上。</span> <span class="stamp time" title="2008-05-29 17:00">2008-05-29 17:00</span> <span class="op"><a href="/privatemsg.del/579918" class="post_act">删除</a></span> <p class="pm-parent">回复原文: 我也要试一试。</p> </li>
我们从饭否私信代码上得到的信息就这些。遗憾的是,饭否私信中,关于“回复原文”是以明文内容形式出现,而不是以原私信ID的形式出现。后期处理时通过搜索功能解决此问题并非不能,只是如果饭否官方能够再将此功能完善的话,会省整理者不少力气。
饭否的私信源码分析完毕。至于如何读写cookie,如何写代码,如何以数据库的形式来管理下载的数据,是第二阶段的事情了。待我一一实现。
windows下的正则式工具介绍之二:powergrep
May 5th
上文介绍了RegexBuddy,本文介绍另一款windows下的正则式软件:PowerGREP,号称“The Most Powerful GREP Tool for Windows”,windows下最强大的GREP工具。看清楚了,是最强大,而非之一。与RegexBuddy一样,也是商业软件,其售价为US$149.00,合人民币1000有奇。如果说RegexBuddy是撰写正则式的贴心助手,那么PowerGREP则是应用正则式在文本文件中搜索替换的强大工具。现在我们看看,它究竟有什么功能敢号称最强。
基本界面
点击可以看大图。另外,还有一组图片来自powergrep官网,附上了官网的部分介绍,以及个人评论。
- 内容搜索图片,点这里;
在本抓图中,我搜索了c:\My Documents\My Web Sites文件夹及其子目录下所有的html文件。我使用了一条正则表达式把搜索范围限定在HTML tag之内,使用另一条正则式在这些标记中搜索所有的email地址。 - 搜索和替换,点这里和这里;
一个好用的功能是可以预览结果而不是立即替换。匹配结果以黄色标出。双击匹配就能打开对应的文档并检验其内容。
点击执行后,颜色改变,表示已经实施替换。 - 收集信息和统计数据,点这里;
本例是“检测Apache网络日志--google search terms”的例子。本例使用的正则式在PowerGREP帮助文档中有详细讲解。 - 灵活的“撤消”历史记录,让你不再抓狂,点这里;
在执行替换的同时,PowerGREP已经备份了原文件。只要你没有手动删除这些备份的文件,你可以随便撤消你做过的任何操作。世界上真有后悔药的呀。 - 搜索PDF文档,点这里;
PDF也能使用正则式进行搜索?当然了,你没有看错。只是,要确保PDF文档中你要搜索的内容是文字而非图像。也就是说,扫描版的PDF不享受此功能的哟。 - 在MS word 文档中搜索,点这里;
这个功能也十分有用。我记得还有个东东叫ViEmu for Word & Outlook,可以在word和outlook中模拟vim,当然可以使用正则式搜索替换了。不过,ViEmu一来也是收费软件(在2008年5月31日之前是79美刀,之后是99美刀),我还没有找到免费版本;二来其正则式是vim风格的,只习惯Perl风格的同学可能不太习惯。在google documents里也支持正则式搜索了,具体语法、风格尚未广泛测试。 - 在MS Excel中搜索,点这里;
同样也是批量搜索、替换。不单单是对一个文档、一个sheet。 - 以16进制模式,在2进制文档中搜索,点这里;
跟二进制编辑器界面类似,多了正则式批量搜索替换功能。 - 在zip压缩文档中搜索,点这里;
把zip文件当作普通文件夹来搜索。很强大吧? - 正则表达式序列,点这里;
大多数正则式工具一次只支持一条正则式的操作。而PowerGREP可以一次执行多条正则式!使用checkbox来进行多项选择。 - 定制颜色显示,点这里;
该功能比较一般。除非软件中的颜色设置特傻,一般我是不会改变默认颜色搭配的。
功能演示
PowerGREP官网还提供了一组flash做的demo,见下。
- 使用正则式匹配email地址(2′47”)。点这里;
- 升级版权信息(3′38)。点这里;
- 与RegexBuddy的无缝链接(1′57”),点这里;两个软件是亲兄弟,当然哥俩好啦!
- 文件选择(3′08”),点这里;PowerGREP提供了贴心的特性,来帮助你筛选需要的文档。
- 其它特性(8′37”),点这里;总而言之,PowerGREP是功能强大。自己发掘吧!
软件下载
目前其最新版为3.4.2,更新于2008年1月18日。其官网为www.powergrep.com,可以去下载其最新版试用。该软件为商业软件。
- 如果你偶然路过,尝新而已,那只需下载试用版即可;
- 如果你觉得好用、准备常用、手有余钱、非正版不用,不妨花美金购买;要花人民币1000多块哟^_^
如果你喜欢它,同时你认为优秀的网络资源是应该和朋友免费分享的,从而想获得该软件的全功能免费版,好吧,我也成全你,请在本文后留言(附邮箱),我会把这个小东西的链接发给你(最新版为3.4.2,我手头的全功能版为3.3.3,也足够用了)。更新:
请移步至此下载PowerGREP 3.5.0版。
———————————————————————————————————
windows下的正则式工具介绍之一:RegexBuddy
Apr 30th
俗话说,工欲善其事,必先利其器。关于windows下的正则表达式工具,这里推荐的是:RegexBuddy和PowerGREP。在linux下,也有好用的正则表达式工具,例如grep的兄弟们,只不过是都是基于命令行的。而这两款windows下的小工具,其突出特点是可视化,允许尝试和预览,极大地方便了使用者。
RegexBuddy:网址是http://www.regexbuddy.com。在编写正则式时,它提供可视化的支持、提示、调试方面的便利;在使用正则表达式时,它无私地将正则式转换为多种语言的字串,还提供了代码输出功能。正则式助手,该称号名副其实。
基本界面
正则式的基本功能无外乎搜索和替换。在本文中,我们使用匹配Email的正则式,代码如下:
\b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b
此时,RegexBuddy的界面如图:
在点击“Explain Token”时,能对当前的正则式片断的作用作出详细解释,例如当你把光标移动到\b上再点击Explain Token,就会激活帮助文档,自动定位到Word Boundaries这一段。
如果想对刚才编写的这条正则式进行测试和验证,可以点击“Test”进行测试。这时,在下边的文本框输入所需要匹配测试的文字,例如dog@animals.com,匹配结果就以黄色背景色标出。在本例中,你或许没有得到正确的匹配,呵呵,那是正常的。为什么?答案见文章结尾。
拷贝粘贴
RegexBuddy能把正则式以多种字符串格式拷贝出来。还是刚才那条正则式,根据需要,它可以被拷贝为:
'\\b[A-Z0-9._%-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b' "\\b[A-Z0-9._%-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b" '/\\b[A-Z0-9._%-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b/i'
具体的选项在copy菜单里,如下图所示。你不必为单双引号、正反斜线操心了。
在paste菜单项中也有类似应用,不赘述。
正则式->代码
如果你想把刚才编写好的正则式应用在程序中,这里还有一个选项:Use,界面见下图:
在上面的match和replace之间点击,其代码也相应自动调整;当选取不同的language时,代码也会相应调整。它支持的语言格式为:
- C#
- Delphi(NET/Win32)
- Java/JavaScript/ECMAScript
- PCRE
- PHP
- Perl
- Python
- RealBasic
- Ruby
- VB
另外,它还有function选项,分别用以实现下述功能:
- If/else branch whethe the regex matches (part of) a string. If/else验证正则式是否匹配字串(的一部分)。 最常用的功能。
- If/else branch whethe the regex matches a string entirely. If/else验证正则式是否匹配整条字串。
- Get the part of a string matched by the regex. 取得字串中与正则式匹配的部分。Get the part of a string matched by a capturing group. 取得字串中所匹配的捕获组。这一条我也是刚刚知道,很有用哟。
- Get an array of all regex matches in a string.将字串中所有的匹配保存到数组中。
- Iterate over all matches in a string。列出字串中所有的匹配项。(例如,在使用正则式’\w’来匹配字串’abc’时,本function列出的内容为’a',’b',’c’.)。单词iterate的含义是重复。
- Comment with RegexBuddy’s regex tree. RegexBuddy的正则树的注释。
文本分割split
如果需要处理的文本是以某种分隔符隔开的,而该种分隔符恰好又能使用正则式描述,(例如html标签),此时regexbuddy的split功能就可以大显身手了。我随便打开了一个饭否网页,对其源代码中的消息部分(<div id=“stream”>与</div>之内)的文本进行了处理,使用如下正则式删除了所有的尖括号内容,只留下普通文本。
使用的正则式为:
<[^>]+>
软件界面以及运行结果请见下图。
结尾:
关于本文开头提出的小问题,细心的你或许一下子就能看出答案了!见下图:
只要选中Case insensitive选项中OK啦!如果你没有找到,或许是因为该软件是英文的,一时间您没有注意到该选项;或者您对正则式还不太熟悉。
软件下载
上文已经提到,其官网为www.regexbuddy.com,可以去下载其最新版试用。该软件为商业软件。
- 如果你偶然路过,尝新而已,那只需下载试用版即可;
- 如果你觉得好用、准备常用、手有余钱、非正版不用,不妨花美金购买;
- 如果你喜欢它,同时你认为优秀的网络资源是应该和朋友免费分享的,从而想获得该软件的全功能免费版,好吧,我也成全你,请在本文后留言(附邮箱),我会把这个小东西的链接发给你(最新版为3.1.1,我手头的全功能版为3.1.0,也足够用了)。
下篇文章将要介绍另一款regex工具:PowerGREP,敬请期待。
本文为rex.zhasm原创,原文地址在http://iregex.org/blog/y2008/m04/d30/regexbuddyregexbuddy.html,可以在遵循CC协议的条件下转载。
————————————-
2008.12.26 更新:
本文已经关闭评论,即将发布3.2.0完全版。不会晚于2008.12.28。敬请期待。
2008.12.28 更新:
请移步至此下载RegexBuddy 3.2.0版。
[老贴整理]如何使用正则式从英文句子里提取词根
Apr 25th
以前在chinaunix回答过这样一个问题,用到了正则表达式(而且我认为正则式解决此类问题是最合适的。)
学英语的一些例句,每句都有若干词根相同的词,例如 She swears to wear the pearls that appear to be pears. 但是每句的词根都未必相同;我希望把这些包含词根的词都标记出来,请问如何写?
这里说的词根不是原本词根的定义,只是一组字母序列,比如
9. The dust in the industrial zone frustrated the industrious man.
词根是dust或ust
10. The just budget judge just justifies the adjustment of justice.
词根是dust
11. I used to abuse the unusual usage, but now I’m not used to doing so.
词根是use,有变形
12. The lace placed in the palace is replaced first, and displaced later.
词根是lace
13. I paced in the peaceful spacecraft.
词根是pace
14. Sir, your bird stirred my girlfriend’s birthday party.
词根是ir
如果您对此问题感兴趣,请独立思考后再继续阅读本站提供的解决方法。







Comments