directory search
Ruby用户指南 3、开始 4、简单的例子 5、字符串 6、正则表达式 7、数组 8、回到那些简单的例子 9、流程控制 10、迭代器 11、面向对象思维 12、方法 13、类 14、继承 15、重载方法 16、访问控制 17、单态方法 18、模块 19、过程对象 20、变量 21、全局变量 22、实变量 23、局部变量 24、类常量 25、异常处理:rescue 26、异常处理:ensure 27、存取器 28、对象的初始化 29、杂项 RGSS入门教程 1、什么是RGSS 2、开始:最简单的脚本 3、数据类型:数字 4、数据类型:常量与变量 5、数据类型:字符串 6、控制语句:条件分歧语句 7、控制语句:循环 8、函数 9、对象与类 10、显示图片 11、数组 12、哈希表(关联数组) 13、类 14、数据库 15、游戏对象 16、精灵的管理 17、窗口的管理 18、活动指令 19、场景类 Programming Ruby的翻译 Programming Ruby: The Pragmatic Programmer's Guide 前言 Roadmap Ruby.new 类,对象和变量 容器Containers,块Blocks和迭代Iterators 标准类型 深入方法 表达式Expressions 异常,捕捉和抛出(已经开始,by jellen) 模块 基本输入输出 线程和进程 当遭遇挫折 Ruby和它的世界 Ruby和Web开发 Ruby Tk Ruby 和微软的 Windows 扩展Ruby Ruby语言 (by jellen) 类和对象 (by jellen) Ruby安全 反射Reflection 内建类和方法 标准库 OO设计 网络和Web库 Windows支持 内嵌文档 交互式Ruby Shell 支持 Ruby参考手册 Ruby首页 卷首语 Ruby的启动 环境变量 对象 执行 结束时的相关处理 线程 安全模型 正则表达式 字句构造 程序 变量和常数 字面值 操作符表达式 控制结构 方法调用 类/方法的定义 内部函数 内部变量 内部常数 内部类/模块/异常类 附加库 Ruby变更记录 ruby 1.6 特性 ruby 1.7 特性 Ruby术语集 Ruby的运行平台 pack模板字符串 sprintf格式 Marshal格式 Ruby FAQ Ruby的陷阱
characters

我们再看一个更有趣的程序.这次我们来测试一个字符串是否和一个由简明模式(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 one."
  false
ruby> chab "Maybe this? {0x35}"    # wrong kind of brackets
  false
ruby> chab "Or this? <0x38z7e>"    # bogus hex digit
  false
ruby> chab "Okay, this: <0xfc0004>."
  true 

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

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

# Requires an ANSI terminal!
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
~~~ 

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

我们再试几个输入:

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  版权声明:RUBY文档中心的所有文章标明[原创]的均为本站作品,版权属RUBY中文化计划,若转载请注明;标明[翻译]的其外文版权归原作者,译文版权属RUBY中文化计划;标明[转贴]的,若原作者感到侵犯了他的著作权,那么请及时跟主持人联系,我们会尽快更正。  
Previous article: Next article: