系列文章原载于自己的博客,TOPI.CO (http://topi.co) ,某天不小心就 push 错啦,懒得从头再来,上传到 Ruby-China 来,一是方便自己回顾,另外也方便跟我一样的初学者
Ruby 大部分的内置类型都和其它的编程语言很相似。主要有 strings,integers,floats,arrays 等等。然而,只有脚本语言,如 Ruby,Perl,和 awk 等提供了内置表达式类型的支持。正则表达式尽管比较隐蔽,但却是一个很强大的文本处理工具。
正则表达式是使用指定的模式匹配字符串的一种简单的方法。在 Ruby 中,创建正则表达式的典型方式是把模式写在两个斜线之间/pattern/
。
毕竟,Ruby 就是 Ruby,正则表达式也是对象,也能像对象般操作。
例如,你可以使用下面的正则表达式写一个模式,它匹配一个字符串中包含有 Perl 或 Python。
/Perl|Python/
在正斜线体内,是两个我们要匹配的字符串,它们使用"|"分隔。这个管道符
的意思是"左边的或者右边的",在这个模式中是 Perl 或者 Python。
你还可以在模式中使用括号
,就像是在算术表达式中使用的那样,因此这个模式还可以写成
/P(erl|ython)/
你还可以在模式中指定重复。例如加号,/ab+c/
匹配字符串中一个 a 后面有一个或多个
b 然后跟着是一个 c。把加号换成星号,/ab*c/
创建的正则表达式是匹配一个 a 后面跟着0个或多个
b 然后跟着是一个 c。
你还可以在模式中匹配一组字符。常用的字符类型例子有\s
,它匹配一个空白字符
(space,tab,换行符,等等);\d
匹配任意数字
;\w
匹配任意的典型单词字符
。句号(.)
匹配 (基本上)任意字符
。
我们把所有这些组合起来,做成实用的正则表达式。
/\d\d:\d\d:\d\d/ # a time such as 12:34:56
/Perl.*Python/ # Perl, zero or more other chars, then Python
/Perl Python/ # Perl, a space, and Python
/Perl *Python/ # Perl, zero or more spaces, and Python
/Perl +Python/ # Perl, one or more spaces, and Python
/Perl\s+Python/ # Perl, whitespace characters, then Python
/Ruby (Perl|Python)/ # Ruby, a space, and either Perl or Python
一但创建了一个模式,不能使用它是件很郁闷的事情。匹配操作符=~
用来对一个字符串进行正则表达式匹配。如果匹配成功,=~返回第一次匹配成功的位置,否则它返回 nil。也就是说,你可以在 if 和 while 的条件声明中使用正则表达式。例如下面的代码片段,
如果字符串中包含有文本 Perl 或 Python 时,输出一条信息。
puts "Scripting language mentioned: #{line}" if line =~ /Perl|Python/
你能使用 Ruby 替换所有出现有 Perl 和 Python 的地方。
line.gsub(/Perl|Python/, 'Ruby')
从 iHower 的 Ruby on Rails 实战圣经中摘一个示例,用正则表达式抓取手机号码:
phone = "139-1234-5678"
if phone =~ /(\d{3})-(\d{4})-(\d{4})/
start_with = $1
mid_num = $2
end_as = $3
end