在这些模式(pattern)里,些或组合都有独特意义,包括:
复制代码 代码如下:
范围描述符 (比如,[a - z] 表示在a 到 z 范围内个字母)
\w 字母或数字;相当于 [0-9A-Za-z]
\W 非字母,数字
\s [ \t\n\r\f]空;相当于 [ \t\n\r\f]
\S 非空
\d [0-9]数字;相当于 [0-9]
\D 非数字
\b 退格符 (0x08) (仅在范围描述符内部时)
\b 字边界(word boundary) (在范围描述符外部时)
\B 非字边界
* 前面元素出现0或多次
+ 前面元素出现1或多次
{m,n} 前面元素最少出现m次,最多出现n次
? 前面元素最多出现1次;相当于 {0,1}
| 和前面或后面表达式匹配
群( grouping)
那些模式中共同使用古怪词汇叫做正则表达式.就象Perl样,Ruby也用前斜杠(而不是双引号)将它们括起来.如果你以前从未使用过正则表达式,也许它们看起来除了规则(regular)什么都不是,但花上点儿时间了解它们是明智.当你需要对串进行模式匹配,查找或其它操作时,它高效表达能力能治好你头痛(并节约很多行代码).
举个例子,设想我们想要测试个串是否符合这样描述信息"由小写f开头,跟个大写字母,并可能跟许多非小写字母在后面."如果你是个老练C员,大概你头脑里已经装满几十行了,对不对?承认吧,你难以控制住自己.在Ruby里,你只需要将你串用正则表达式/^f[A-Z](^[a-z])*$/检验下就可以了.
那"个由<>括起来16位数呢"?没问题.
复制代码 代码如下:
ruby> def chab(s) # "contains hex in angle brackets"
| (s =~ /<0(x|X)(\d|[a-f]|[A-F])+>/) != nil
| end
nil
ruby> chab "Not this _disibledevent=>正则表达式挺让人头痛,但你很快会因能够如此高效地表达出你心中意思而感到满足.
下面是个可以帮助你实验正则表达式小,把它存为regx.rb,然后在命令行里输入'ruby regx.rb'运行.
复制代码 代码如下:
# Requires an ANSI terminal!
st = "\033[7m"
en = "\033[m"
while TRUE
pr "str> "
STDOUT.flush
str = gets
not str
str.chop!
pr "pat> "
STDOUT.flush
re = gets
not re
re.chop!
str.gsub! re, "#{st}\\{en}"
pr str, "\n"
end
pr "\n"
这个小要求输入两次,次串,次正则表达式.输入串由正则表达式检验,然后用反视高亮度显示所有匹配部分.先别管细节,等会儿就有代码分析.
复制代码 代码如下:
str> foobar
pat> ^fo+
foobar
~~~
上面红色部分将在输入中以反视表示出.下面"~~~"行是为了方便那些使用基于浏览器人.
我们再试几个输入:
str> abc012dbcd555
pat> \d
abc012dbcd555
如果让你感到惊讶,看看本页开头部分那个表格: \d和字母d无关,而是对应于单个数字.
如果有不止种思路方法能匹配模式会怎样呢?
str> foozboozer
pat> f.*z
foozboozer
~~~~~~~~
的所以foozbooz被匹配而不只是fooz,是个正则表达符尽可能匹配最长子串.
下面是个将冒号分隔数字时间段从串中隔离出来模式匹配.
str> Wed Feb 7 08:58:04 JST 1996
pat> [0-9]+:[0-9]+(:[0-9]+)?
Wed Feb 7 08:58:04 JST 1996
"=~"是个用于匹配正则表达式匹配(matching)运算符;它会返回在串里找到匹配位置,或者返回 nil 表示模式无法匹配.
ruby> "abcdef" =~ /d/
3
ruby> "aaaaaa" =~ /d/
nil
最新评论