在本指南中,我们将学习所有关于Ruby Regex的知识。它们实际上被称为Ruby正则表达式,它们不应该与模式匹配相混淆。如果我们只是笼统地认为,正则表达式是用来定义一个搜索模式的。它们只是一个小的字符序列。你用它们来匹配或寻找一个特定的字符串,通过定义搜索模式来处理和提取数据。然而,与模式匹配有一个小小的区别。让我们在本指南中了解关于它们的一切。
Ruby 正则表达式
希望你已经了解了正则表达式的一般概念和用途。这种表达式非常普遍的用途是验证和解析。例如,一个电子邮件有一个特定的设计和定义,你可以使用Ruby regex来设置这个设计和定义。这种特定的设计有助于验证。你的程序将能够检测到电子邮件是有效的还是无效的。
序言:equal-tilde,Ruby的 "匹配运算符"
=~ 被称为 "匹配运算符",它可以用来根据正则表达式测试一个字符串。
它将左边的正则表达式与右边的字符串相匹配。
当发现任何匹配时,将返回String中第一个匹配的索引。如果没有找到该字符串,nil 。
Ruby Regex - 语法
在Ruby中,正则表达式是写在两个正斜杠里面的/SearchPattern/ 。无论你的搜索模式是什么,你都需要将它们写在两个正斜杠之间。例如,看一下下面的代码。
my_string = "There are 10 eggs and 3 pancakes inside this bag"
my_string =~ /eggs/
=> 13
在上面的代码中,我们只是简单地匹配字符串eggs ,看它是否存在于给定的字符串中。 一旦找到它,程序将返回该词第一个字母的索引值,在本例中,e 。因此,输出结果将是13,这就是eggs 的第一个字母的索引值。你也可以使用方法match() 。请看下面的代码。
my_string = "There are 10 eggs and 3 pancakes inside this bag"
my_string.match(/eggs/) ? "Valid" : "Invalid"
=> "Valid"
my_string.match(/eggs42/) ? "Valid" : "Invalid"
=> "Invalid"
match 方法返回true 或false 。让我们来看看ruby regex中的一些高级搜索模式。这些正则表达式将帮助你执行许多有用的东西,例如,匹配、捕获、更新、替换电子邮件、联系号码、日期等等。
字符类
由于方括号("["""或"]")的存在,一个字符类是有界限的。使用字符类,你可以匹配一个字符列表,你也可以定义一个范围。例如,如果你正在寻找一个字符串中的某些特定字符集,语法如下。
my_string = "hat"
my_string =~ /[abcde]/
=> 1
my_string = "fly"
my_string =~ /[abcde]/
=> nil
现在,第一个字符串值包含字母a,所以它将返回1 。但第二个字符串不包含任何指定的字符,所以它将返回nil 。
范围(Ranges)
使用ruby regex中的范围,你可以一次匹配多个值。你不需要多次编写它们。你可以简单地定义一个范围搜索模式。
my_string = "I was born in 1998"
my_string =~ /[0-9]/
=> 14
上面的代码将搜索从0到9开始的整数值,并检查它是否存在于一个字符串中。如果找到了,它将返回找到的第一个整数的索引值,在这个例子中,这个整数是1,其索引值是14。
如果你是一个会经常接触到ruby regex的人,你应该考虑记住以下速记语法。
- 使用 \w 而不是 [0-9a-zA-Z_]。
- 使用 \d 代替[0-9]。
- 使用\s 来匹配白色空间(换行、正则空间、制表符)。
修改器
如果我们需要匹配一个以上的字符怎么办?为了一次匹配多个字符,我们需要使用修饰符。
- 使用+,如果你有1个或更多的字符
- 使用\,如果你有0个或更多的字符
- 使用?,如果你有0或1个字符
- 你也可以使用大括号创建一个范围。例如,使用{3,7}来匹配3和7之间的字符。
现在,如果我们把到目前为止所学到的知识结合起来,我们就可以轻松地创建更复杂的搜索模式。
精确字符串匹配
还有很多修饰语我们还没有讨论。有些修饰符是用来精确匹配字符串的。例如,如果我们需要查找给定字符串的长度是否正好是四个字母,那么我们将使用以下方法。
"Ruby Regex Regular Expressions".match /\w{4}/
上面的代码是正确的,但它仍然会匹配,因为给定的字符串有四个以上的字符。那么,我们如何解决这个问题呢?我们就简单地使用下面的代码。
"Ruby Regex Regular Expressions".match /\w{4}$/
对于上面的代码,这个字符串不会匹配。我们正在使用starting of the line 和end of line 修改器。有一个相当简单的解决方案,就是使用.size来寻找字符串的长度。但由于我们正在努力学习更多关于Ruby regex的知识,我们认为,我们已经传递了这个概念。
鲁比雷格斯选项
你可以通过设置选项使你的regex表现得不同。有时,我们需要使它们不区分大小写,或者我们需要忽略空白处的情况。这就是ruby regex选项的作用。
使用i来使你的搜索模式不分大小写。
my_string = "There are 10 eggs and 3 pancakes inside this bag"
p my_string.match(/G/i) ? "Valid" : "invalid"
上面的代码将给出Valid 作为输出。
使用x来忽略空白处。通过使用m,点将与新行相匹配。
小抄
这些列表的灵感来自于ralfebert的小抄和这个优秀的PDF通知。
修改器
| 例子 | 解释 |
|---|---|
| /.*/m | 多行:......匹配新行 |
| /.*/i | 忽略大小写 |
| /.*/x | 扩展:忽略模式中的空白处 |
正则表达式
| 例子 | 解释 | |
|---|---|---|
| /字/ | 完全匹配 | |
| /WordThing/ | 串联 | |
| /(字)(物)/ | 带分组的串联 | |
| /(词 | 物)/ | 匹配 |
| 匹配/(词 | 物)/ | 匹配 |
| /(Word)*/ | 匹配0个或更多(按顺序) | |
| 匹配/(词)+/ | 匹配1个或更多 | |
| /(Word)?/ | 匹配0或1 | |
| /(字){4}/ | 准确匹配4个 | |
| 匹配4个或更多的/(Word){4,}/ | 匹配4个或更多 | |
| /(词){4,6}/ | 匹配4到6个 |
字符串搜索操作
| 例子 | 说明 |
|---|---|
| s.index(target, pos) | 查找目标,从pos开始 |
| s.sub(old, new) | 用新的代替第一个旧的 |
| s.gsub(old, new) | 用新的替代旧的,所有的 |
| s.split(target) | 在目标上分割字符串 |
| s =~ /pattern/ | 包含。第一位置或nil |
| s !~ /pattern/ | 不包含:如果没有找到则为真 |
提取子串
| 例子 | 说明 | ||
|---|---|---|---|
| s.scan(/pattern/) | 返回匹配的数组 | ||
| s.scan(/(p1)(p2)/) | 返回数组的数组 | ||
| str.scan(regexp).each { | match | block } | 将代码块应用于匹配项,顺序保留。 |
| str.scan(regexp) { | match | block } | 和上面一样 |
Regexp类和对象
| 例子 | 说明 |
|---|---|
| Regexp.new(str) | 用str创建Regexp对象 |
| Regexp.new(regexp) | 用字面意思创建regexp |
Regexp.new('\w+') 或 是有效的例子。Regexp.new(\Ruby\)
字符类
| 例子 | 解释 |
|---|---|
| /[abcdef]/ | 字符类 |
| /[a-f]/ | 字符范围 |
| /1/ , /2/ | 匹配不在类中 |
| .(句号) | 任何字符 |
| \d | 数字[0-9]。 |
| \s | Whitepace [\t\r\n\f\s] (空白)。 |
| \w | Alphanumeric [A-Za-z0-9] 字母数字 |
| \D | 非数字1 |
| \S | Non-whitespace3 |
| \W | 非词4 |
Anchors/Boundaries
| 例子 | 解释 |
|---|---|
| \A | 字符串的开头(忽略n)。 |
| \z | 字符串的结尾 |
| 行的开头(在 \n 之后)。 | |
| $ | 行末 |
| \b | 字的边界 |
锚点和边界将不计入字符。
元字符
| 例子 | 解释 | |
|---|---|---|
| [ ] { }^ .$ * ( ) \ + | ? < > | 必须被转义 |
特殊字符
| 例子 | 解释 |
|---|---|
| \xaa | 十六进制字符 aa |
| \Oaaa | Octal character aaa (八进制字符)。 |
| \\ | 反斜线 |
| \n | 新行 |
| \t | Tab |
| \f | 表单进给 |
| [\b] | Backspace(退格)。 |
| \r | 回车 |
最后的思考
正则表达式是非常棒的,但它们有时可能会有点挑战性。你可以通过使用在线工具来设计你的ruby regex,使其更加动态。
现在是你启动编辑器并开始编码的机会了!