Ruby正则表达式字符串匹配与替换操作详解
时间:2026-08-17 | 作者:游戏探长 | 阅读:0正则匹配
提到Ruby,正则表达式是绕不开的话题。
它就像一把瑞士军刀,从简单的字符串验证,到复杂的网页内容抽取,几乎无所不能。
虽然总有人抱怨正则的效率,但考虑到它那令人发指的匹配能力,这点代价完全值得。
Ruby中最常用的两个匹配方法
说到Ruby的正则,最核心的就是两个匹配方法:=~ 和 match。
两者的区别在于:=~ 返回匹配位置,match 返回匹配到的内容。
=~ 的用法
先聊聊 =~,它的用法非常直接:
message="afhadhffkdf414j"
regex=/[a-z](d{3})[a-z]/
puts regex=~message
Ruby里用 // 来定义正则表达式。
这段代码想匹配的是:三个连续数字,两边各紧挨着一个小写字母。
运行结果是 10。
为什么是10?
=~ 返回的是匹配结果在字符串中首次出现的位置,且从0开始计数。
第10个字符正好是那个匹配的起点,所以结果非常直观。
match 的用法
再看 match:
message="afhadhffkdf414j"
regex=/[a-z](d{3})[a-z]/
puts regex.match(message)
这次输出的是 f414j。
match 返回的是整个匹配到的字符串,而不是位置。
注意看正则里用了括号——(d{3})。
这表示要把中间的三位数字单独抽出来。
拿到这部分内容,可以使用 $1:
message="afhadhffkdf414j"
regex=/[a-z](d{3})[a-z]/
regex.match(message)
puts $1
结果自然是 414。
为什么是 $1 而不是 $0?
$0 保存的是整个脚本的文件路径,咱们要的是第一个捕获组,所以 $1 才是正确的选择。
匹配多个结果时怎么处理
如果字符串里有多个符合规则的片段,上面那种写法只会匹配到第一个。
其实Ruby早就准备好了——scan 方法:
message="afhadhffkdf414j9tr3j43i3433094jwoert223jwew123dfdf"
regex=/[a-z](d{3})[a-z]/
message.scan(regex).each{|m| puts "The result is #{m[0]}"}
输出一目了然:
The result is 414 The result is 223 The result is 123
使用 scan 可以一次性拿到所有匹配结果。
简洁高效,适合处理多段匹配内容。
正则表达式的分组
分组是正则里特别实用的功能。
它不仅能把表达式拆成逻辑单元,还能在匹配成功后通过 $1、$2、$3…… 来引用每个分组捕获到的内容。
来看一个例子:
print $1,"n",$2 if "a1b2c3d4e5" =~ /(w{2})(w*)/
这段代码会输出前两个分组匹配到的文本。
具体结果大家可以在环境里跑一跑感受一下。
字符串的正则替换
替换操作同样离不开正则。
Ruby提供了两个方法:sub 和 gsub。
sub:只替换第一次匹配gsub:替换所有匹配
print "abcd".sub(/w/,"9") print "n" print "abcd".gsub(/w/,"9")
sub 会把第一个字母换成9,输出 9bcd。
gsub 会把每个字母都换掉,输出 9999。
正则中的特殊全局变量
除了前面提到的 $1、$2……,Ruby还内置了几个非常实用的全局变量。
它们专门用来获取匹配位置附近的信息:
$`—— 匹配文本之前的全部内容$'—— 匹配文本之后的全部内容$1、$2…… —— 分组匹配的文本
举个例子:
print $`, "n", $1, "n", $' if "ab9cd" =~ /(d)/
这段代码会把匹配到的数字之前的部分、数字本身、以及数字之后的部分分别打印出来。
在需要上下文的时候,这种方式非常适合快速提取。
总结
总的来说,Ruby的正则生态非常成熟。
从基础的匹配,到高级的分组、替换、全局变量,一套组合拳下来,大部分字符串处理任务都能轻松搞定。
掌握这些技巧,写代码的时候会顺手很多。
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- 使用RVM切换Ruby与Rails版本的实现方法
- 时间:2026-08-18
-
- Ruby语言是什么及入门使用方法
- 时间:2026-08-18
-
- Ruby on Rails网站项目搭建入门指南
- 时间:2026-08-18
-
- Ruby插入排序算法实现与二路插入排序代码示例
- 时间:2026-08-18
-
- Ruby图片滤镜算法实现代码与核心原理
- 时间:2026-08-18
-
- Ruby中Hash哈希结构基本操作方法详解
- 时间:2026-08-18
-
- Ruby面向对象编程:类方法与类扩展详解
- 时间:2026-08-18
-
- Ruby正则表达式语法详解与常用示例代码
- 时间:2026-08-18
精选合集
更多大家都在玩
大家都在看
更多-
- 糖尿病完全不能吃糖吗
- 时间:2026-09-15
-
- 蚂蚁庄园小课堂2026年9月16日最新题目答案
- 时间:2026-09-15
-
- 小鸡答题今天的答案是什么2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园每日答题答案2026年9月16日
- 时间:2026-09-15
-
- 以下哪种粮食是酿造绍兴黄酒的主要原料 蚂蚁庄园今日答案9月16日
- 时间:2026-09-15
-
- 劝学名句“及时当勉励,岁月不待人”出自哪位诗人 蚂蚁庄园今日答案9.16
- 时间:2026-09-15
-
- 蚂蚁庄园今天答题答案2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园答题今日答案2026年9月16日
- 时间:2026-09-15
