分享 初学者连载系列之五:Ruby 编程之正则表达式初探

kevinhua · 2012年04月06日 · 最后由 LinuxGit 回复于 2012年04月06日 · 5082 次阅读

系列文章原载于自己的博客,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

+1 lz 好人,新手赞一个。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号