松本行弘的程序世界 8 正则表达式
正则表达式基础
检索“像那样的东西”
正则表达式的语法
普通字符
除了表中所示的元字符以外的普通字符,都与该字符自身相匹配。
字符集合
用括号(【】)括起来的部分为字符集合。与括号内所含的每一个字符都匹配。比如,【abcde】能与小写字母abcde中的任何一个相匹配。
字符集合中,用中划线(-)来指定范围。所以,【abcde】可以用【a-e】来代替。
字符集合中,第一个字符是【\^】时,表示取反。就是说,不与括号(【】)中的字符相匹配。
任意一个字符
表示任意一个字符读得模式是“.”。除了匹配换行符。
重复
贪婪与懒惰
贪婪:寻找符合的最长的,遍历完再回溯,
懒惰:寻找第一个符合的。
分组
将模式绑定起来的功能称为分组。(ma)+
选择
|
锚点
指定位置而不是字符来进行匹配。称为锚点(anchor)。
三个陷阱
记号多、密度高的表达式
为应对这一问题,出现了扩展正则表达式。
0次以上的重复
贪婪型匹配
正则表达式对象
面向对象语言Ruby中,所有数据都是对象。正则表达式也是对象。
Ruby程序中正则表达式对象写成/.*/的样子。
正则表达式对象可以用正则表达式类方法生成。程序中由组合字符串生成正则表达式时,使用类方法更自然。
选项
Ruby正则表达式末尾斜杠的后面,可以为这个正则表达式添加选项。
正则表达式匹配的方法
特殊变量
Ruby中有源于Perl的特殊变量。以$开头的变量。
字符串与正则表达式
split的本质
分割字符串的方法split,与正则表达式组合起来能实现很多功能。
字符串的扫描
置换
想要置换与字符串模式匹配的部分,可以用置换方法。
正则表达式的应用实例与“鬼车”
正则表达式是表达字符串模式的一种微型语言。正则表达式由字符本身、字符模式、锚点以及重复等组合而成。
解析日志文件的方法
避免使用$的方法
记号$不美观。Ruby中,以match方法替代=~运算符,就可以在程序中不使用这些记号了。
从邮件中取出日期的方法
典型拼写错误的检索方法
Ruby1.9的新功能“鬼车”
“鬼车”新正则表达式库。1
2
3
4
5
6DSL
Domain Specific Language,意为面向特定领域的编程语言。
DSL分内部DSL和外部DSL。
内部DSL,就是往既有的语言中加入特定领域的词汇,使之DSL化。如软件编译工具Rake中表达依存关系的内部DSL。
make是一个同样目的的工具,它使用Makefile来表达依存关系。Rake可以利用Ruby的编程功能、方法定义、条件分歧和循环等,不管关系有多复杂,都可以编程对应。
外部DSL,不是扩展现有的语言,而是面向特定目的,如SQL就是DSL的代表性例子。正则表达式也可以称作是以实现模式匹配为目的的外部DSL。