Ruby Regex的指南

242 阅读5分钟

在本指南中,我们将学习所有关于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 方法返回truefalse 。让我们来看看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 lineend 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 {matchblock }将代码块应用于匹配项,顺序保留。
str.scan(regexp) {matchblock }和上面一样

Regexp类和对象

例子说明
Regexp.new(str)用str创建Regexp对象
Regexp.new(regexp)用字面意思创建regexp

Regexp.new('\w+') 或 是有效的例子。Regexp.new(\Ruby\)

字符类

例子解释
/[abcdef]/字符类
/[a-f]/字符范围
/1/ , /2/匹配不在类中
.(句号)任何字符
\d数字[0-9]。
\sWhitepace [\t\r\n\f\s] (空白)。
\wAlphanumeric [A-Za-z0-9] 字母数字
\D非数字1
\SNon-whitespace3
\W非词4

Anchors/Boundaries

例子解释
\A字符串的开头(忽略n)。
\z字符串的结尾
行的开头(在 \n 之后)。
$行末
\b字的边界

锚点和边界将不计入字符。

元字符

例子解释
[ ] { }^ .$ * ( ) \ +? < >必须被转义

特殊字符

例子解释
\xaa十六进制字符 aa
\OaaaOctal character aaa (八进制字符)。
\\反斜线
\n新行
\tTab
\f表单进给
[\b]Backspace(退格)。
\r回车

最后的思考

正则表达式是非常棒的,但它们有时可能会有点挑战性。你可以通过使用在线工具来设计你的ruby regex,使其更加动态。

现在是你启动编辑器并开始编码的机会了!