Ruby中常会用到
正则表达式。
正则表达式是用来表达字符串的模式(pattern)的。也可以这么
理解:我们使用正则表达式来表示某种搜索规则,然后使用该正则表达式来完成字符串的搜索工作。举个
例子,假定有这样的搜索规则:“字符串以’FOO’开始,以’R’结束”,那么就可以使用以下正则表达式来表示该规则。
/^FOO.*R$/
Ruby用//将正则表达式括起来。^表示开头,$表示结尾,.*表示0个以上的任意字符。
现在就讲讲正则表达式的规则的写法。正则表达式中有很多上述的具有特别
意义的字符。首先是下列字符。
[ ]
范围描述符。[a-z]表示从a到z之间的任意一个。
\w
英文字母和数字。即[0-9 A-Z a-z]。
\W
非英文字母和数字
\s
空字符,即[\t\n\r\f]。
\S
非空字符。
\d
数字,即[0-9]。
\D
非数字。
\b
词边界字符(在范围描述符外部时)
\B
非词边界字符
\b
退格符(0x08)(在范围描述符内部时)
*
前面元素出现0次以上
+
前面元素出现1次以上
{m,n}
前面元素最少出现m次,
最多出现n次
?
前面元素出现0次或1次
|
选择
( )
群组
其他字符
该字符本身
例如,“^f[a-z]+”表示“第一个字符是f,后面是若干个从a到z之间的字符”,可以是“fobar”或“fool”等等。这种表达法就是正则表达式(regular
expression)。在搜索字符串时正则表达式非常有用,因此在UNIX的世界里,正则表达式得到了广泛的应用。grep程序就是个代表。许多人是不是经常会用到它呢?
为了学会使用正则表达式,先来试试下面这个程序。请用
文件名regx.rb将程序保存下来以后再运行它。
st = "\033[7m"
en = "\033[m"
while TRUE
print "str> "
STDOUT.flush
str = gets
break if not str
str.chop!
print "pat> "
STDOUT.flush
re = gets
break if not re
re.chop!
str.gsub! /#{re}/, "#{st}\\&#{en}"
print str, "\n"
end
print "\n"
该程序会在第一次输入的字符串中按照
第二次输入的正则表达式的要求寻找合适的字符串,并将其以反色显示出来。下面是运行结果。
str> foobar
pat> ^fo+
foobar
^^^
# 实际上foo的部分被反色显示了。
再试一试。
str> abc012dbcd555
pat> \\d
abc012dbcd555
~~~ ~~~
从上例可以看出,该程序可以检测出多处符合条件的字符串。
str> foozboozer
pat> f.*z
foozboozer
~~~~~~~~
在这个例子中,正则表达式“f.*z”并非只是对应到fooz,而是一直对应到foozbooz这里。这是因为,正则表达式总是在符合条件的结果中选择较长的一个。
正则表达式甚至可以写出让人一眼看不透的模式,这可能会像谜语一样有趣。但若过分凝炼的话,以后就很难搞懂当初的想法了。
str> Wed Feb 7 08:58:04
JST 1996
pat> [0-9]+:[0-9]+(:[0-9]+)?
Wed Feb 7 08:58:04 JST 1996
~~~~~~~~
Ruby用’/’将正则表达式括起来。另外还有一些方法会自动将字符串变为正则表达式。
% ruby -le 'print "abcdef" =~ /d/'
3
% ruby -le 'print "aaaaaa" =~ /d/'
nil
‘=~’是使用正则表达式进行匹配的
caozuofu.html" target="_blank">操作符,它返回匹配成功时的位置。
到底哪些方法可以处理正则表达式呢?关于这个问题,请查阅参考手册。