7.1 正则可做啥
- 测试串是否匹配指定的模式
- 从串中提取内容它们要么全部匹配要么部分匹配指定的模式
- 替换串中的内容根据指定的模式
7.2 Ruby的正则
正则式的写法:/模式/。除了.|()[]{}+\^$*?,其它串都标识要匹配自身,如果希望匹配这些特殊字符,则使用\作前缀,如/\*/,表示匹配一个*,同样 /\//表示匹配/。
模式串相当于用双引号括起来的串,里面可以使用#{...}表达式来动态设值。
Matching Strings with Patterns
~=用于匹配指定的模式,返回的是第一个匹配的位置,从0开始。
/cat/ =~ "dog and cat" # => 8 /cat/ =~ "catch" # => 0 /cat/ =~ "Cat" # => nil #也可以颠倒一下位置 "dog and cat" =~ /cat/ #=>
不匹配返回nil,同样可作为if while的条件
str = "cat and dog" if str =~ /cat/ puts "There's a cat here somewhere" end
假设有这样的文本文件
0: This is line one 1: This is line two 2: This is line three 3: And so on...
File.foreach("testfile").with_index do |line, index| puts "#{index}: #{line}" if line=~ /on/ end produces: 0: This is line one 3: And so on... #如果希望不匹配,使用!~与=~对应 if line !~ /on/ 将打印: produces: 1: This is line two 2: This is line three
Change Strings with Patterns
str = "Dog and Cat" new_str = str.sub(/Cat/, "Gerbil") #sub只会替换第一个匹配串,gsub会替换全部,g表示global。
sub是gsub都返回替换后的新串,如果没有替换发生,则返回是原串的copy。
如果希望在原串上直接修改,使用sub!与gsub!。但是要注意:sub!与gsub!在没有匹配出现时,返回nil。
7.3 Digging Deeper(百尺杆头-更进一步)
正则式在Ruby对应的类是Regexp,可将其对象分配给变量,传入方法。
str = "dog and cat" pattern = /nd/ pattern =~ str #=> 5 str =~ pattern #=>5
创建正则式除了/.../以外,还可以直接调用Regexp#new,或者%r{...}
/mm\/dd/与Regexp.new("mm/dd")与%r{mm/dd}产生的Regexp对象是一样的。
正则式可选项
创建正则式时,可添加可选择项。或选择的添加位置如下XX位置。/.../xx或Regexp.new("", xx)
i 表示忽略大小写
o 只替换一次,模式中包含#{...}的情况下,只替换一次。
m "."默认表示除换行外的任意字符,添加/m后,表示所有字符;
x 支持正规式的格式化
Matching Against Patterns(匹配对应的模式)
定义了Regexp对象后,就可以通过Regexp#match(string)或=~或!~来匹配模式了,
name = "Fats Waller" name =~ /a/ # => 1 name =~ /z/ # => nil /a/ =~ name # => 1 /a/.match(name) # => #<MatchData "a"> 这里返回的是对象 Regexp.new("all").match(name) # => #<MatchData "all"> #两种格式在没有匹配上时,都返回ni
使用MatchData对象,能更易操作匹配返回的结果。
#match#pre_match 匹配前的串 #match[0]匹配的第一个位置 #match#post_match匹配后的串 def show_regexp(string, pattern) match = pattern.match(string) if match puts "#{match.pre_match}->#{match[0]}<-#{match.post_match}" else "no match" end show_regexp('very interesting', /t/) # => very in->t<-eresting show_regexp('Fats Waller', /lle/) # => Fats Wa->lle<-r show_regexp('Fats Waller', /z/) # => no match
Deeper Patterns
. | ( ) [ ] { } + \^ $ * ?这些是特殊字符,需要使用规避符。下面对这些特殊字符的意义进行描述。
^或$,强制只匹配start or end of line,一行的开始与结束。与之相似的是\A与\z 及\Z(如果行以\n结束,则匹配\n前面的部分)。
同样\b表示匹配独立的单词,而\B表示匹配不是独立的单词。见下面的示例:
str = "this is\nthe time" show_regexp(str, /^the/) # => this is\n->the<- time show_regexp(str, /is$/) # => this ->is<-\nthe time show_regexp(str, /\Athis/) # => ->this<- is\nthe time show_regexp(str, /\Athe/) # => no match show_regexp("this is\nthe time", /\bis/) # => this ->is<-\nthe time show_regexp("this is\nthe time", /\Bis/) # => th->is<- is\nthe time
Character Classes(匹配字符集合)
[...]表示匹配这其中的任意一个。
show_regexp('Price $12.', /[aeiou]/) # => Pr->i<-ce $12. show_regexp('Price $12.', /[\s]/) # => Price-> <-$12. show_regexp('Price $12.', /[$.]/) # => Price ->$<-12.
[c1-c2]表示从c1到c2
a = 'see [The PickAxe-page 123]' show_regexp(a, /[A-F]/) # => see [The Pick->A<-xe-page 123] show_regexp(a, /[A-Fa-f]/) # => s->e<-e [The PickAxe-page 123] show_regexp(a, /[0-9]/) # => see [The PickAxe-page ->1<-23] show_regexp(a, /[0-9][0-9]/) # => see [The PickAxe-page ->12<-3] [^...]取非 show_regexp('Price $12.', /[^A-Z]/) # => P->r<-ice $12. show_regexp('Price $12.', /[^\w]/) # => Price-> <-$12. show_regexp('Price $12.', /[a-z][^a-z]/) # => Pric->e <-$12. show_regexp('It costs $12.', /\s/) # => It-> <-costs $12. show_regexp('It costs $12.', /\d/) # => It costs $->1<-2.
---------------------------------正则式到此,如果有时间后面再继-----------------------
相关推荐
《Programming Ruby》是一本关于Ruby编程语言的经典书籍,它的第三章深入探讨了Ruby的基本语法和核心概念。在这一章中,作者介绍了变量、常量、符号、数组、哈希等核心数据类型,以及控制流(条件语句和循环)和方法...
《Programming Ruby 1.9》是一本经典的Ruby编程语言教程,其源代码包含了大量实例和示例,旨在帮助读者深入理解Ruby的语法、特性以及编程实践。这些源代码是学习和探索Ruby语言的重要资源,涵盖了从基础语法到高级...
《Programming Ruby - The Pragmatic Programmer's Guide》第二版(2005年注释版)是一本在IT行业中享有盛誉的经典书籍,专门针对Ruby编程语言进行了深入浅出的讲解。该书不仅覆盖了Ruby语言的基础知识,还探讨了其...
- **正则表达式**: Ruby内置了强大的正则表达式引擎,方便进行文本处理。 - **块和迭代器**: 块是Ruby中的匿名函数,常用于数组和集合的操作。 - **文件操作**: Ruby提供了丰富的文件和目录操作API。 - **命令行参数...
"ruby--.txt"可能是一个文本文件,其中包含了Ruby的代码示例、笔记或者问题解答,通过阅读可以加深对Ruby语法和实践的理解。 "Ruby语言入门教程附实例"和"ruby-mht"文件很可能是包含实例的教程,实践是学习编程的...
你可以通过阅读和分析这些代码来学习如何在实际问题中应用正则表达式。同时,这也是一个很好的机会去比较不同语言处理正则表达式的方式,以及优化代码性能的方法。 在进行 LeetCode 练习时,确保先理解题目的需求,...
Segaran -- Programming Collective Intelligence -- 2008 -- code.7z
《Programming Ruby》是一本关于Ruby编程语言的经典著作,由Dave Thomas、Andy Hunt和Chad Fowler合著。这本书自2004年初版以来,一直是学习Ruby的首选资源,被誉为“Pickaxe”书,因其封面的图标而得名。Ruby是一种...
《Programming Ruby》是著名的Ruby语言教程,英文版的书籍旨在为全球开发者提供深入理解Ruby编程语言的途径。这本书详尽地介绍了Ruby的语法、特性、类库以及编程实践,是学习和进阶Ruby编程的宝贵资源。源代码的提供...
Grayson -- Python and Tkinter Programming -- 2000 -- code.7z
Barry, Griffiths -- Head First Programming -- 2009 -- code.7z
《Programming Ruby》被誉为是学习Ruby语言的最佳指南,这本书在IT界享有极高的声誉,被亲切地称为“镐头书”,其价值与影响力无远弗届。本书不仅详细介绍了Ruby语言的核心概念、语法结构以及编程实践,还深入探讨了...
《Programming Ruby》中文版第二版是一本专注于Ruby编程语言的经典教程。这本书的两个版本——高清扫描版和高清文字版,都是为了便于读者学习和查阅,其中都带有书签功能,帮助读者快速定位到相关内容。 Ruby是一种...
Summerfield -- Programming in Python 3 -- 2009 -- code.7z
通过阅读《Programming Ruby 1.9 (3rd edition)》并研究提供的源码,开发者可以深入掌握Ruby 1.9的核心概念、设计模式以及最佳实践,从而提高编程效率和代码质量。这本书是Ruby开发者的必备参考资料,无论是初学者...
5. 实际应用:Rich Kilmer提到,在阅读了第一版《Programming Ruby》之后,他感到很受启发,随后创立了一家主要通过应用Ruby解决实际问题的公司,这表明了Ruby语言的实用性。 6. 社区和库的支持:Rich Kilmer还强调...
通过阅读《Programming Ruby》,读者不仅可以学习到Ruby的基本语法,还能深入了解其背后的哲学和设计思想,从而成为一名高效的Ruby开发者。书中的实例和练习将帮助你更好地掌握Ruby编程,提升解决问题的能力。