ruby正则表达式:ruby 正则表达式 教程

我们再看个更有趣.这次我们来测试串是否和个由简明模式(concise pattern)编码产生描述相匹配.
在这些模式(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
Tags:  js正则表达式教程 php正则表达式教程 正则表达式教程 ruby正则表达式

延伸阅读

最新评论

发表评论