第12章 正则表达式和基于它的字符串操作
要匹配特殊字符,需要使用反斜杠来对它们进行转义。如:需要匹配字符问号,需要这样编写代码:
/\?/
反斜杠的含义是“请不要将下一个字符当作特殊字符处理;请将它们当成本身处理。”
特殊字符包括^、$、?、.、/、\、[、]、{、}、(、)、+、*、
有时想在模式中的某个位置匹配任意的字符,可以使用特殊的同配字符.(圆点)。
/ejected/
匹配dejected和rejected。也匹配%ejected和8ejected。
字符集
字符集是明确的字符列表,放在正则表达式中的中括号里:
/[dr]ejected/
表示“匹配d或r,其后接ejected”
在字符集中,也可以插入字符范围。如:
插入所有小写字母:/[a-z]/
/[A-Fa-f0-9]/匹配从a到f中的任何一个字符(大写或小写)或任何一个数字
如果在字符集的开头加一个脱字符号(^),可以实现否定类型的查找。如:
肥十六进制数字匹配的字符集:/[^A-Fa-f0-9]/
常见字符集的特殊转义序列
要与任何一个数字匹配:/[0-9]/
也可以使用更简洁的特殊转义序列:/\d/
另外2个有用的预定义字符集的转义序列是:
\w 与任何数字、字幕或下划线(_)想匹配
\s 与任何空白字符相匹配。
这些预定义字符集每一个都有一个补集。要与任何一个非数字的字符匹配,可以使用:
/\D/
\W与数字、字幕或下划线之外的任何一个字符相匹配,\S与任何一个肥空白字符串匹配。
用小括号来捕获子匹配
$1包含的是正则表达式中从左侧开始的第一对小括号内的子模式所匹配的字符串。变量$n包含正则表达式中从左侧开始的第n对小括号内的字模式所匹配的字符串。
正则表达式记法有一个用来表示“0个或1个”这种情形的特殊字符:问号(?)
/Mrs?\.?/
s后面的问号表示此位置有一个s或没有一个s的字符串都能与该模式匹配。后面跟这一个问号的圆点来说,也是同样道理(反斜杠表示这是一个实际的圆点,而不是一个特殊的圆点通配符)
情况“0个或多个”需要使用星号*
/<\s*\/\s*p\s*>/
每一次序列\S*出现,都表示匹配的字符串在此模式中出现数目不确定的空白符——包括0个。
量词“一个或多个”用一个加号(+)表示
/\d+/匹配由一个或多个连续的数字构成的任意序列。
特定的次数重复
明确指定子模式的具体重复次数,可以通过将一个数放在大括号中:
/\d[3]-\d[4]/
该模式与555-1212及其他与电话号码类似的序列匹配。
也可以在大括号中指定一个范围:
/\d[1,10]/
该模式与含有1-10个连续数字的任意字符串相匹配。
可以在正则表达式中执行字符串内插操作。使用#{...}
str="def"
"def"
/abc#{str}/
/abcdef/
在把字符串放入正则表达式之前,可以转义字符串中的特殊字符Regexp类提供了Regexp.escape类方法,可以来做这件事。
Regexp.escape("a.c")
"a\\.c"
Regexp.escape("^abc")
\\^abc
String#scan
scan方法从左到右扫描一个字符串,重复地进行测试以寻找指定模式的各个匹配。结果返回到一个数组中。如:
>>"testing 1 2 3 testing 4 5 6".scan{/\d/}
=>["1","2","3","4","5","6"]
如果在传递给scan的正则表达式中使用了小括号分组,它返回一个数组的数组。
>>str = "Leopold Auer was the teacher of Jascha Heifetz."
=>"Leopold Auer was the teacher of Jascha Heifetz."
>>violinists = str.scan(/A\[A-Z]\w+\)\s+([A-Z]\w+/)
=>[["Leopold","Auer"],["Jascha","Heifetz"]]
String#split
>>"Ruby".split(//)
=>["R","u","b","y"]
sub/sub! gsub/gsub!
sub接受两个参数:一个正则表达式和一个替代字符串。无论字符串的那一部分与正则表达式相匹配,该部分被删除,然后用替代字符串来取代它
>>"typigraphical error".sub(/i/,"o")
=>"typographical error"
gsub与sub类似,但是也有不同。不同之处是,只要字符串的剩余部分还能够与模式匹配 ,gsub就会继续进行替代。
>>"capitalize every word".gsub(/\b\w/){|s| s.upcase}
=>"Capitalize Every Word"
\b表示单词边界
grep
grep属于Enumerable模块而不属于String类。grep直接基于正则表达式参数进行选择操作。把与作为参数提供的正则表达式匹配的所有元素都返回到一个数组中:
>>["USA,"UK","France","Germany"].grep(/[a-z]/)
=>["France","Germany"]
也可以使用select完成同样的事:
["USA,"UK","France","Germany"].select{|c|/[a-z]/.match(c)}
grep只能用来选择字符串——而且不会在字符串和数之间进行自动转换,比如运行下面的代码,会得到一个空数组:
[1,2,3].grep(/1/)
因为数组中没有能与正则表达式/1/匹配的字符串元素。
分享到:
相关推荐
《Ruby for Rails中文版》是美国作者David Black所著的一本专为Rails开发者介绍Ruby语言的书籍,旨在帮助读者深入理解Ruby的基础与Rails框架的内在联系。Ruby是一种面向对象的、动态类型的编程语言,它的简洁语法和...
根据给定的文件信息,以下是本书《Ruby for Rails中文版,完整扫描版》的相关知识点概述: 1. 针对Ruby初学者:本书作为入门教材,旨在帮助初学者掌握Ruby语言基础。这对于已经熟悉其他编程语言但尚未接触过Ruby的...
《Ruby for Rails中文版》是一本深入探讨Ruby on Rails框架的书籍,它的源代码提供了丰富的实践示例,帮助读者更好地理解和应用Rails开发技巧。在这个压缩包中,包含了多个与Rails编程相关的文件,如`r4rmusic-1`、`...
### Ruby for Rails 知识点概述 #### 一、书籍背景与重要性 - **书籍定位**:《Ruby for Rails》被广泛认为是学习Ruby语言的必读之作,特别是对于那些希望利用Ruby on Rails(RoR)进行高效Web开发的学习者而言。...
Ruby三神书之一(其余的两本是Agile.Web.Development.with.Rails和Rails Recipes,在我的资源列表也有) “本书作者曾经教过我很多Ruby知识……每一个从其他语言转到Rais的人都应该拥用本书。为了充分发挥Rails的...
Ruby是一种面向对象的编程语言,以其简洁、优雅的语法著称,被广泛应用于Web开发,尤其是与Ruby on Rails框架结合使用。"Ruby新手学习书"和"Rails_4_days"这两个资源是为初学者设计的,旨在帮助他们快速掌握Ruby语言...
《Ruby基础教程(中文第四版)》是深入学习Ruby语言的重要参考资料,由Ruby之父亲自审校并作序推荐,其权威性和准确性不言而喻。 该书涵盖了Ruby的基础知识,包括但不限于以下内容: 1. **变量和常量**:Ruby中的...
总之,无论你是对编程感兴趣的新手,还是想扩展技能树的开发者,这份“Ruby入门教程中文PDF 附实例”都将是你宝贵的参考资料。通过学习,你不仅可以掌握Ruby的基础知识,还能体验到编程的乐趣和效率。
本书《敏捷Web开发之Rails应用详解》第三版主要介绍了如何使用Ruby on Rails框架来进行敏捷Web开发。Rails是一个用Ruby语言编写的开源Web应用框架,它遵循MVC(Model-View-Controller)架构模式,并且强调代码的简洁...
本资源"For-Rails-Beginners"显然是为那些希望入门Ruby on Rails的初学者设计的,特别是对于台湾地区和使用传统中文的用户。 在Rails框架中,以下是一些核心概念和知识点: 1. **Ruby语言基础**:在学习Rails之前...
这个"Ruby语言入门教程(中文版)[PDF]"涵盖了Ruby的基础到进阶内容,适合初学者和希望巩固Ruby知识的开发者。通过阅读并实践教程中的例子,读者可以逐步掌握Ruby编程,并开启在Ruby世界中的探索之旅。
这份电子版手册详细介绍了Ruby的核心概念、语法以及常见问题的解决方案,旨在帮助开发者快速掌握并熟练运用Ruby。 在Ruby的世界里,了解基本语法是入门的第一步。这包括变量(局部变量、实例变量、类变量和全局变量...
2. **控制结构**:Ruby中的流程控制有if/else、case、while/until循环、for循环以及块(Proc和Lambda)的使用,这些都是编写逻辑代码的关键部分。 3. **面向对象**:Ruby是面向对象的,每个值都是一个对象。它支持...
本教程的中文版将引导你逐步了解并掌握这些知识点,无论你是编程新手还是寻求新挑战的开发者,都能从中受益。通过阅读和实践,你将能够编写出优雅、高效的Ruby代码,并进一步探索这个充满魅力的编程世界。
Ruby是一种面向对象的、动态...通过这个中文教程,你将掌握其基本语法,理解面向对象编程的概念,熟悉常用的类库和工具,并能够运用Ruby进行实际的项目开发。无论你是初学者还是有经验的开发者,都能从这个教程中受益。
《笨方法学Ruby》是针对初学者的一本中文教程,旨在通过实践性的学习方式帮助读者掌握Ruby编程语言。这本书的特点是强调动手实践,通过一系列的练习来深化对Ruby语法和编程概念的理解。以下是对该书内容及压缩包文件...
Web开发敏捷之道 应用Rails进行敏捷Web开发第4版 原版书及代码 (rails3.2版) 原书名为:Agile Web Development with ...里面包含了第三版的中文版,和第四版 部分内容相似,可提供参考, enjoy rails, good luck ;)
在"ruby.rar"这个压缩包中,包含了三本中文教程,可以帮助初学者和经验丰富的开发者深入理解Ruby语言的核心概念和高级特性。 首先,让我们探讨一下Ruby的基础知识。Ruby由日本人松本行弘(Yukihiro Matsumoto)于1995...
- 控制结构:Ruby中的条件语句有if/else、unless、case,循环有while、until、for以及块(block)和循环控制关键字如break和next。 - 函数与方法:Ruby中的函数定义使用def关键字,方法可以接收可变数量的参数,...