Ruby 手册 | 24 - 正则表达式 Regexp

159 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第24天,点击查看活动详情

一、正则表达式

在对字符串进行处理时,经常会查找或者替换符合一定格式要求的字符串,正则表达式常用于此。

正则表达式是用于表述字符串规则的表达式,常用的如获取邮箱地址或者 URL 地址以及校验注册用户时输入的用户名或者密码是否符合规则。

正则表达式是由一些普通的字符和一些特殊含义的 标记符 号组成;普通字符包括大小写字母、数字和普通符号,用于匹配字符串中的内容,如 d 表示数组 w 表示字母等,而一些特殊字符则有其他用处如 [] 表示组 ^ 表示开始匹配的节点 $ 表示结束匹配等。

\d{4}-\d{2}-\d{2}

上述正则表达式中 \d 表示匹配数字,{4} 则表示匹配 4 个数组,- 符号就表示匹配 - 符号,所以上述正则表达式可以匹配的字符串时类似年份的字符串,如 ”2022-08-29“。

正则表达式常见的标记符号有:

符号含义
\w匹配一个字母或数字
\D匹配一位非数字
\d匹配一位数字
*匹配前面的字符、表达式或括号里的字符0次或多次
+匹配前面的字符、表达式或括号里的字符至少一次
?匹配前面的字符一次或0次
.匹配任意单个字符,包括数字、空格和符号
\转义符,把后面的特殊意义的符号按原样输出
[ ]匹配[ ]内的任意一个字符,即任选一个
指字符串开始位置的字符或子表达式
$经常用在表达式的末尾,表示从字符串的末端匹配。如果不用它,则每个正则表达式的实际表达形式都带有.*作为结尾。这个符号可以看成^符号的反义词
|匹配任意一个有|分隔的部分
?!不包含。这个组合经常放在字符或者正则表达式前面,表示这些字符不能出现。如果在某整个字符串中全部排除某个字符,就要加上^和$符号
( )表达式编组,()内的正则表达式会优先运行
{m,n}匹配前面的字符串或者表达式m~n次,包含m和n次
[^]匹配任意一个不在中括号内的字符

二、正则表达式的定义

Ruby 和 Perl 一样,为正则表达式提供了内建支持,因此在 Ruby 中使用正则表达式会非常的方便。

Ruby 中定义正则表达式的方式有 3 中,可以使用正则表达式的 Regexp 类的构造函数,实例化一个正则表达式,还可以使用 "/pattern/" 的形式或者 "%r{patter}" 来创建。

reg1 = Regexp.new("[A-Za-z] Ruby")
reg2 = /[A-Za-z] Ruby/
reg3 = %r{[A-Za-z] Ruby}

正则表达式创建完成后可以使用 =~ 操作符来对指定的字符串进行匹配

reg = Regexp.new("[A-Za-z] Ruby")

str = "12He234253ll324o Ruby"
puts str =~ reg
puts str.match(reg)

执行上述代码,输出结果如下:

15
o Ruby

=~ 返回匹配的字符串的索引位置,match 方法返回匹配的字符串