Archive for May, 2009
正则表达式的单行和多行
星晨大海间无数刚跨入 regex 领域的童鞋们总会混淆 single line 和 multiline 这两种模式,认为这是两种互斥的模式,这都怪 Larry 大叔胡搞瞎搞的起名字,还是小鄙视一下大叔吧,但是大叔的丰功伟绩依然让我辈心向往之。
单行模式主要用于改变点号的匹配规则,而多行模式用于改变 ^ 和 $ 的匹配规则;默认情况下单行模式和多行模式均处于 off 状态,可以分别激活或同时激活这两种模式。
默认情况下,点号能够匹配除换行符外的所有字符,如果想要匹配到换行符的话,就需要激活单行模式,单行模式下点号就能匹配天地间的一切字符了,所以余大将之译为点号通配模式。
而 ^ 和 $ 在默认情况下是匹配整个目标文本起始和结束的锚,也就是说等价于 \A 和 \Z 的,如果激活了多行模式的话,^ 和 $ 就变成了能够匹配到行起始和行结束的锚。
所以,最后说一句,单行模式和多行模式之间,一毛钱关系都没有。
正则表达式 Unicode 编码模式中的点号匹配问题
很多时候我们在构造正则表达式时不会考虑编码的问题,因为默认的 ASCII 编码已经足够我们应对大多数开发场景,但这并不代表对编码的需求就不存在,典型的例子就是用户注册时,要求用户名一定要是中文的情况,这种情况下 ASCII 编码就无能为力了。现在轮到 Unicode 这砣灵丹妙药出场了。
通常情况下我们都认为一个字符就对应到一个 Unicode 代码点,即一一对应的关系。但这里存在理解上的偏差,一般人所谓的单个字符在 Unicode 编码中可能并不和单个代码点对应而是由多个代码点组合而成。比如 å 这种带声调修饰的单个字符在 Unicode 编码中就是由 \u0061 和 \u030A 这两个代码点组合而成。这就又给我们带来了新的问题,正则表达式的点号元字符在匹配这样的由多个代码点组合而成的字符时,是匹配一个代码点映射的单字符还是匹配多个代码点合成后映射到的单字符?
my $str = “å”;
$str =~ m/(.)/;
print “normal: $1\n”;
$str =~ m/(\X.)/;
print “\\X mode: $1\n\n”;
上面代码输出效果如下:
可以看到要想正确的匹配 å 单字,必须通过 \X 来显示通知正则引擎“匹配一个 Unicode 代码点组合”。不幸的是并不是所有编程语言的正则表达式引擎都实现了 \X 模式。(所以到目前为止,在字符处理方面 Perl/PCRE 还是当之无愧的王者啊!)
如何说服老板和客户使用 Rails 开发企业级应用程序
昨天 RubyConf China 在上海召开,与会嘉宾包括 Ruby 教主 Matz 在内的多位国内外顶级大牛,虽然身在成都,但我还是通过曹力向现场嘉宾提了一个问题“如何说服老板和客户使用 Rails 开发企业级应用程序”,答曰:
- 快速响应需求变更
- 系统可维护性更高
- 所需开发人员更少
相信这会给使用各种 Rails 类框架的程序员们相当的启发吧。顺便说一下曹力同学是《Professional JavaScript for Web Developers》中文版的译者之一,功力相当深厚的说,这里是他的博客,大家去围观啊!:)
关于 djrum
djrum 这个名字还是有一些特殊含义的。这个词由 dj- 前缀加 -rum 后缀组合而成,前面的 dj 是为了向 django 致敬,因为没有 django 就没有 djrum 项目;后面的 rum 则是为了纪念我人生第一个 .NET 项目 sarum,虽然 sarum 已经消失在岁月的沧桑中…
一句话概括 Project Djrum 就是:基于 Project Babel 的 UI 原型,用 Django 搭建起来的怪异工具集。
btw. babel 和 djrum 均遵循 GPL v3 协议,所以敬请期待吧…
