手机
当前位置:查字典教程网 >脚本专栏 >ruby专题 >ruby 正则表达式 教程
ruby 正则表达式 教程
摘要:我们再看一个更有趣的程序.这次我们来测试一个字符串是否和一个由简明模式(concisepattern)编码产生的描述相匹配.在这些模式(pa...

我们再看一个更有趣的程序.这次我们来测试一个字符串是否和一个由简明模式(concisepattern)编码产生的描述相匹配.

在这些模式(pattern)里,一些字符或字符组合都有独特的意义,包括:

复制代码 代码如下:

[]范围描述符(比如,[a-z]表示在a到z范围内的一个字母)

w字母或数字;相当于[0-9A-Za-z]

W非字母,数字

s[tnrf]空字符;相当于[tnrf]

S非空字符

d[0-9]数字;相当于[0-9]

D非数字字符

b退格符(0x08)(仅在范围描述符内部时)

b字边界(wordboundary)(在范围描述符外部时)

B非字边界

*前面元素出现0或多次

+前面元素出现1或多次

{m,n}前面元素最少出现m次,最多出现n次

?前面元素最多出现1次;相当于{0,1}

|与前面或后面的表达式匹配

()群(grouping)

那些模式中共同使用的古怪词汇叫做正则表达式.就象Perl一样,Ruby也用前斜杠(而不是双引号)将它们括起来.如果你以前从未使用过正则表达式,也许它们看起来除了规则(regular)什么都不是,但花上一点儿时间了解它们是明智的.当你需要对字符串进行模式匹配,查找或其它操作时,它的高效的表达能力能治好你的头痛(并节约很多行代码).

举个例子,设想我们想要测试一个字符串是否符合这样的描述信息"由小写f开头,跟一个大写字母,并可能跟许多非小写字母在后面."如果你是一个老练的C程序员,大概你的头脑里已经装满几十行程序了,对不对?承认吧,你难以控制住自己.在Ruby里,你只需要将你的字符串用正则表达式/^f[A-Z](^[a-z])*$/检验一下就可以了.

那"一个由<>括起来的16位数呢"?没问题.

复制代码 代码如下:

ruby>defchab(s)#"containshexinanglebrackets"

|(s=~/<0(x|X)(d|[a-f]|[A-F])+>/)!=nil

|end

nil

ruby>chab"Notthisone."

false

ruby>chab"Maybethis?{0x35}"#wrongkindofbrackets

false

ruby>chab"Orthis?<0x38z7e>"#bogushexdigit

false

ruby>chab"Okay,this:<0xfc0004>."

true

虽然,初看起来正则表达式挺让人头痛的,但你很快会因能够如此高效地表达出你心中的意思而感到满足.

下面是一个可以帮助你实验正则表达式的小程序,把它存为regx.rb,然后在命令行里输入'rubyregx.rb'运行.

复制代码 代码如下:

#RequiresanANSIterminal!

st="33[7m"

en="33[m"

whileTRUE

print"str>"

STDOUT.flush

str=gets

breakifnotstr

str.chop!

print"pat>"

STDOUT.flush

re=gets

breakifnotre

re.chop!

str.gsub!re,"#{st}"

printstr,"n"

end

print"n"

这个小程序要求输入两次,一次字符串,一次正则表达式.输入的字符串由正则表达式检验,然后用反视高亮度显示所有匹配部分.先别管细节,等会儿就有代码分析.

复制代码 代码如下:

str>foobar

pat>^fo+

foobar

~~~

上面红色部分将在程序输入中以反视表示出.下面的"~~~"行是为了方便那些使用基于字符浏览器的人.

我们再试几个输入:

str>abc012dbcd555

pat>d

abc012dbcd555

如果让你感到惊讶,看看本页开头部分的那个表格:d与字母d无关,而是对应于单个数字.

如果有不止一种方法能匹配模式会怎样呢?

str>foozboozer

pat>f.*z

foozboozer

~~~~~~~~

之所以foozbooz被匹配而不只是fooz,是因为一个正则表达符尽可能匹配最长的子串.

下面是一个将冒号分隔的数字时间段从字符串中隔离出来的模式匹配.

str>WedFeb708:58:04JST1996

pat>[0-9]+:[0-9]+(:[0-9]+)?

WedFeb708:58:04JST1996

"=~"是一个用于匹配正则表达式的匹配(matching)运算符;它会返回在字符串里找到的匹配的位置,或者返回nil表示模式无法匹配.

ruby>"abcdef"=~/d/

3

ruby>"aaaaaa"=~/d/

nil

【ruby 正则表达式 教程】相关文章:

Ruby元编程小结

使用Ruby on Rails快速开发web应用的教程实例

Ruby简明教程之数组和Hash介绍

ruby开发的交互式程序例子

Ruby简明教程之循环语句介绍

Ruby 中一些百分号(%)的用法小结

ruby 程序的执行顺序

ruby 数组使用教程

创建自定义的Ruby gem包的教程

ruby 流程控制 方法

精品推荐
分类导航