WordPress 更新到2.6.5 停掉了UTW这一伟大的插件...
September 16th, 2008
RegexBuddy和PowerGrep是我在windows下常用的两款正则式工具。前者是帮助编写正则式的辅助工具,后者是进行批量搜索替换的实用工具。这两款软件都是外国人写的。今天介绍国人史寿伟先生写的一款正则式工具,MTracer 2.0。
MTracer 2.0软件版本
MTracer2.0全名是RegexMatchTracer,官方主页在regexlab.com。上面说最近更新日期是2007.10.07,不过,从我今天下载的程序的修改日期来看,是2008.09.13。变化是,之前作者提供的是绿色的程序,现在提供的是msi的安装包。 本文以下提到MTracer时,若无特殊说明,均指MTracer2.0。
MTracer软件特性
作为一款正则表达式撰写辅助程序,它拥有查找匹配、替换模式、分割模式,可以分别进行相应操作。前两种用的比较多,各种语言或正则式工具都有相应语句或函数来实现;第三种分割模式是指使用正则表达式来描述字符串的分割符,以便将字串分割成子串数组。举个简单的例子来说,可以使用正则式\d+;?将abcd12;sdf55656asdfasd82asd33x字串分割成子串数组:
在实际操作时,你总会遇到使用分割模式才能最有效率地解决的问题。
除了一般的选项(忽略大小写、单行\多行、全局),它提供了从右向左、扩展模式两种匹配选项。
从右向左:平时查找字串最右边的正则式匹配,可以借助于?和$来定位。而在MTracer下,这款比较令人耳目一新的选项十分好玩,虽然我还没有在实际操作时遇到过确需此选项的例子。
扩展模式:包括如下选项:
- 注释 (?#xxx):在正则式中加入注释以便提高可读性;
- 模式修改符 (?ismg-ismg):小范围内修改匹配模式;
- 非捕获组 (?:xxx):匹配而不捕获,便于计数,同时还可以节省内存,提高效率(根据《精通正则表达式》的说法);
- 预搜索(零宽度断言):十分有用的匹配选项,只匹配位置,而不消耗字符;有四种模式,详见手册;
- 独立表达式 (?>pattern):此选项在《精通正则表达式》中,被余晟先生翻译为“固化分组”,即无论匹配成功与否,内部都不进行回退,都不会再次尝试匹配;
- 条件表达式(?(x)y|z):与C语言的三目操作符类似,x条件为真则进行y匹配,否则进行z匹配。其中x部分有四种模式,详见手册;
- 递归表达式 (?R):对另一部分子表达式的引用,而不是对其匹配结果的引用。当被引用的表达式包含自身,则形成递归引用。
个人比较常用的选项是非捕获组和预搜索。
MTracer最有用的特性
相对于另一款正则式撰写辅助程序RegexBuddy而言,MTracer最有用的特性是中文的正则式分析树。虽然RegexBuddy也有此功能,但是MTracer的正则式分析树是中文的。这对于需要此功能但是不愿意使用英文软件的用户来说非常方便。对于初学者也很有帮助。
值得说明的是,正则式的中文术语在中文里还没有形成统一的规范。以我自身的阅读经历而言,似可分为两类:何伟平译的《Perl Programming》第三版中大量使用的正则式术语译法为第一套方案,余晟先生译的《精通正则表达式》第三版中使用的正则表达式为第二套。个人倾向于第二套。
MTracer使用的正则表达式术语,与这两套术语均有相异之处。
如果有人使用上述第二套术语将RegexBuddy汉化的话,估计在中国的普及率会大幅提高。题外话。
与RegexBuddy的简单比较
还是列表说明吧。
| 属性 |
MTracer |
RegexBuddy |
| 界面语言 |
中文 |
英文 |
| 大小 |
471kb |
9.1 MB |
| 价格(单用户) |
个人RMB49.00
公司RMB298.00 |
US$ 39.95 |
| 免费版的限制 |
正则式长度限制 |
7天免费使用时间 |
| 帮助文件 |
原来版本有,最新的msi版已经不带帮助文件;需要的话可以下载本站上传的手册。 |
齐全。包括4本电子书,其中3本是关于正则表达式的教程、参考手册,1本是RegexBuddy的操作手册。十分翔实。语言是英文。 |
| 匹配模式 |
- 匹配
- 替换
- 分割
|
- 匹配
- 替换
- 分割
|
| 匹配选项 |
- 忽略大小写(开关)
- 单行、多行
- 全局局部可选
- 从右至左
- 扩展模式(详见上文)
|
- 忽略大小写 (开关)
- 单行、多行
- 默认全局
- 点号匹配新行
- ^$匹配换行符
- 空白字符宽松模式
- 扩展模式(依语言而定)
|
| 历史功能 |
“文本片断”即是 |
History |
| 导出字串为指定语言 |
- 原状导出
- Visual Basic
- C/C++
|
- 原状导出
- C/C#
- Perl(m//或s///格式)
- Basic
- Java
- JavaScript
- Pascal
- PHP (//)
- PostgreSQL
- Python
- Ruby
- SQL
- Tcl
- XML
- 还包含在上述语言中如何调用该正则式的模块,功能强大、有用、好用。(Use)
|
| 常用正则库 |
帮助文件中有提及 |
程序中包含该功能,有定义、例代码、匹配实例。
帮助文件中也有。 |
| 扩展性 |
支持插件(疑安装目录下的stdplgin.dll是其插件,功能不详。) |
与PowerGrep相关联。 |
| 帮助论坛 |
开放,地址在此 |
仅对付费注册软件的用户开放。 |
| 界面高度可定制 |
不支持 |
支持 |
| 是否支持批量替换外部文件 |
不支持 |
支持 |
当然,没有提到的功能、细节还不少,这里仅仅是列出本人关注的属性。
MTracer 2.0注册
付出劳动,换来报酬,是当今任何行业都认可的规则。MTracer需要注册费,这一点也十分正常。其价格是48元人民币。比起US$ 39.95的RegexBuddy来,可谓性价比极高。
如果不注册,会有什么限制呢?请看图。哦,是有100个字符的限制。
这是注册后的图。
对于未注册版本,平时写一些短小的正则式,是没有问题的。如果想无限制地使用该程序,花48元支持一下国产程序,何乐而不为?
现在无论主动还是被动,版权意识都在深入人心。这也是本人一直没有把完全版的RegexBuddy和PowerGrep的下载链接贴到blog上、而是采取来Email索取的原因之一。
MTracer2.0采用注册号的方式注册。看来作者深知在国内破解成风,于是很幽默地添加了这样一则菜单选项:如何8小时破解本软件?呵呵。8小时我们可以做许多事情,没有必要浪费在track、debug、crack上。你的时间很值钱的。
这两款软件的完全版我这里都有,如果需要RegexBuddy的话,请占击链接留下信箱索取即可;但是MTracer的话就不要索取了。
相关阅读
chinese, mtracer, powergrep, regexbuddy, tool 工具软件
探索匹配中文的正则表达式
August 24th, 2008
按:本文使用的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
可以这样使用:在字符串这是一些普通文本。hello regex world. pig@animals.com和chicken@birds.com使用正则式[a-z]+@[a-z]+?\.[a-z]+加以匹配,得到的结果为:pig@animals.com和chicken@birds.com。
极端粗放型:点号其实是近乎万能的,可以匹配任何字符,限制只在于换行符的匹配上。匹配中文自然不在话下。作为可有可无的背景符,一个.*就能匹配掉包括中文在内的全部字符。这当然是一种极端的情况,因为这样显示不出中文字符串的特性。这不是本文要探讨的。
极端集约型:如果搜索特定文本,例如在一二三四五六七八九十拾佰百千仟万亿中匹配十拾, 直接使用m/十拾/就能搞定。这同样不是本文要探讨的。与\w能匹配英文字母一样,本文想找的是能够匹配所有汉字,而不匹配其它文本的一种简写方式。
普适型型:由于汉字属于Unicode,我们就从unicode里面找。在Unicode Regular Expressions,列出了unicode的许多种表达方式。搜索chinese,找到如下一行:
| Writing Systems |
Blocks |
| … |
… |
| Chinese |
CJK Unified Ideographs, CJK Unified Ideographs Extension A, CJK Compatibility Ideographs, CJK Compatibility Forms, Enclosed CJK Letters and Months, Small Form Variants, Bopomofo, Bopomofo Extended |
关于CJK的含义,是指中日韩统一表意文字(Chinese Japanese Korean Unified Ideographs),可以参考百度释义,或wiki词条。
再查了一下regular expressions,查到其unicode一节有这样的内容:
\p{InCJK_Unified_Ideographs}: U+4E00..U+9FFF
看到这里,我想起了以前写的《匹配用户名的asp正则表达式(包括中文)》一文中,提到的中文匹配为[\u4e00-\u9fa5],原来是有其对应的速记方式的,虽然两者有最后一组字符的差异。看附图可见U+9fa5,最后一个汉字的模样。
此序列的第一位,U+4e00,是汉字一。
自定义:到目前为止,相当于给汉字找到了官方的身份和说法,使用\p{InCJK_Unified_Ideographs}就能匹配所有的中文字符。我们其实也可以将一些重复出现的东西,封装起来,以备使用。例如,对于阿拉伯数字,我们有\d可以用。对于中文数字一二三四等等,我们有没有办法呢?
$zh_digit=qr/一|二|三|四|五|六|七|八|九|十|零|〇|百|千|万|亿|佰|仟|壹|贰|叁|肆|伍|陆|柒|捌|玖|拾/;
$str="人民币五十一万零三百元整。大写:伍拾壹万零三佰元整。";
while($str =~ s/((?:$zh_digit)+)//)
{
print $1."\n";
} |
其输出结果见附图。
结论
可以使用\p{InCJK_Unified_Ideographs}匹配任意中文字符。在不支持该种标记方式时,也可以使用[\u4e00-\u9fa5]加以匹配。
关于文正则表达式,我觉得尚未穷其奥秘。以前在linux(utf8编码)下,编写scim输入平台的郑码码表时,匹配中文所使用的正则表达式为[\x80-\xff]{3},也能很好地工作。请参阅此文:龙文郑码码表 for scim。其原理我尚不清楚,留待之后有时间研究。如有知情者,也请不吝赐教,先行谢过。
chinese, regex, unicode, utf8, 正则表达式 Uncategorized
匹配用户名的asp正则表达式(包括中文)
July 13th, 2008
有人在正则表达式中文站贴出这样一道问题:
求ASP 用户名 表达式
用户名长度在2-20字符之间,由中文/大小写字母/数字/中划线-/下线线_组成。
这个问题不算难,只要下边一行核心代码就能搞定:
"^[-_a-zA-Z0-9\u4e00-\u9fa5]{2,20}$" |
关键是没有使用过ASP语言。按此页的提示,设置了ASP环境。查询了一些在线的入门级ASP教程之后,解答如下:
<form action="verify.asp" method="post">
姓名:
<input name="name" type="text" />
<input name="Submit" type="submit" value="提交" />
<input name="Submit2" type="reset" value="重置" />
</form> |
它调用以下verify.asp文件:
<%
Function RegExpTest(patrn, strng)
Dim regEx, retVal ' 建立变量。
Set regEx = New RegExp ' 建立正则表达式。
regEx.Pattern = patrn ' 设置模式。
regEx.IgnoreCase = False ' 设置是否区分大小写。
retVal = regEx.Test(strng) ' 执行搜索测试。
If retVal Then
RegExpTest = "合法用户名。"
Else
RegExpTest = "非法用户名。"
End If
End Function
name=request.form("name")
psw=request.form("psw")
sex=request.form("sex")
city=request.form("city")
Response.write RegExpTest("^[-_a-zA-Z0-9\u4e00-\u9fa5]{2,20}$", name)
%> |
运行界面见附图。
另外,还有一些正则表达式可供参考:
匹配中文字符的正则表达式:
匹配双字节字符(包括汉字在内)正则表达式:
匹配空行的正则表达式:
匹配HTML标记的正则表达式:
/ <(.*)> .* <\/\1> | <(.*) \/> / |
匹配首尾空格的正则表达式:
用正则表达式限制只能输入中文:
onkeyup= "value=value.replace(/[^\u4E00-\u9FA5]/g, ' ') " onbeforepaste= "clipboardData.setData( 'text ',clipboardData.getData( 'text ').replace(/[^\u4E00-\u9FA5]/g, ' ')) " |
用正则表达式限制只能输入全角字符:
onkeyup= "value=value.replace(/[^\uFF00-\uFFFF]/g, ' ') " onbeforepaste= "clipboardData.setData( 'text ',clipboardData.getData( 'text ').replace(/[^\uFF00-\uFFFF]/g, ' ')) " |
用正则表达式限制只能输入数字:
onkeyup= "value=value.replace(/[^\d]/g, ' ') "onbeforepaste= "clipboardData.setData( 'text ',clipboardData.getData( 'text ').replace(/[^\d]/g, ' ')) " |
用正则表达式限制只能输入数字和英文:
onkeyup= "value=value.replace(/[\W]/g, ' ') "onbeforepaste= "clipboardData.setData( 'text ',clipboardData.getData( 'text ').replace(/[^\d]/g, ' ')) " |
asp, chinese Q&A
匹配中文的正则表达式
June 2nd, 2008
以前在编写linux下的scim郑码码表时,就跟正则式的中文匹配问题打过交道。当时总结了这样一条经验,utf8编码格式下,中文正则式应该这样书写:
当然,这与语言无关。在perl与python中,都是一样的。
现在,这条正则式又派上用场了。正在编写的一个小程序MiniBlogs Updater中,需要计算用户所输入的文字字数。因为中英文字符编码长度不一,如果直接使用python中的len()函数,它计算的是该字串的实际长度,一个中文字并非等同于一个英文字母的。因此,需要把中文字当成英文字母来处理。
我写了这样一条语句来处理:
length=len(re.sub('[\x80-\xff]{3}','a',msg)) |
它的意思是,把所有的中文都替换成英文字母a,然后再统计字数。(只是统计而已,不修改源字串。)这条语句在windows下utf8文件中能够正常工作。
再分享两则与匹配中文的正则表达式有用的链接:
chinese, python, regex, utf8 resources