《正则表达式必知必会》阅读后记
《正则表达式必知必会》是人邮图灵《xxx必知必会》一套系列的书,作者都是 Ben Forta。这一套“必知必会”系列除了MySql那本外全都看过了。非常适合本人,爱不释手。特点是:快速入门并且专捡实际工作中有用的讲。阅读这类书几乎就是喝一两杯咖啡的时间可以翻四到五章。作者能写这套入门书说明他的功底深厚而且极善表达,可以把复杂的东西变得简单明了。
在翻译上,有几个与其他翻译有不同的:character classes 在《精通正则表达式(第3版)》中译为:“字符组”(见第1章),在本书中译为:“字符类”(见第28页第4章第3节第一段第5行); backreference 在《精通正则表达式》和《正则表达式语法参考》文档中都译为:“反向引用”。还有,正则表达式中有个专用术语:“量词”,这个术语似乎在本书中没有出现。
整个看下来就第十章是本人没能完全理解明白的,主要是没用心看。因为在第九章中讲:JavaScript不支持向后查找(lookbehind),而“前后查找”以前没接触不了解,所以在第十章编写前后查找条件在JavaScript中实现不了。引用书中的原话:“嵌入条件不经常被用到”,“条件模式看起来非常复杂”。这个问题留给自己以后再思考吧!
最后的一点好处是:JavaScript书大多都有正则表达式的章节,以后阅读时可以加深理解和回顾容易遗忘的内容。
比如在《JavaScript高级程序设计(第2版)》中正则表达式的内容在第5章的第4节 RegExp 类型。从中可以知道,创建正则表达式用字面量与用RegExp构造函数,在语法上有什么不同。下面是书中的原文(延伸阅读部分内容):
正则表达式既可以用字面量定义,也可以用构造函数定义,如下所示:
/* * 匹配 bat 或 cat 的首个例子,重点是后面的那个 */ var pattern1 = /[bc]at/i; /* * 与 pattern1 等价,就是用构造函数 */ var pattern2 = new RegExp("[bc]at", "i");
pattern1 和 pattern2 正则表达式定义是等价的。注意在RegExp构造函数中的 argument(引数或参数)均为字符串,而正则表达式的字面量不会传入RegExp构造函数中。RegExp构造函数的argument 是字符串模式,用到转义字符的那些实例就必须由一次转义写成两次转义(double-escape),如:\n(字符\由\\变为\\\\)。
下表显示的是一些字面量与字符串等价的模式:
字面量模式 | 等价字符串 |
/\[bc\]at/ |
”\\[bc\\]at” |
/\.at/ |
“ \\.at “ |
/name\/age/ |
“ name\\/age “ |
/\d.\d{1,2}/ |
“ \\d.\\d{1,2} “ |
/\w\\hello\\123/ |
“ \\w\\\\hello\\\\123 ” |
所以,你可以用实例的 source 属性去查看字符串的源是否与所要的字面量一致。
alert(pattern2.source); //”\[bc\]at”
另外,JavaScript正则表达式不支持以下几种模式:
- POSIX字符类
- \A和\Z
- 并类别、交类别
- 向后查找
- Atomic grouping(原子分组)
- Unicode 的支持
- 命名捕获分组
- s 和 x 这两种匹配模式
- 条件语句
- 正则表达式注释