位置:首页 > Ruby > Ruby正则表达式字符串匹配与替换操作详解

Ruby正则表达式字符串匹配与替换操作详解

时间:2026-08-17  |  作者:游戏探长  |  阅读:0

正则匹配

详解Ruby中正则表达式对字符串的匹配和替换操作

提到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提供了两个方法:subgsub

  • 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的正则生态非常成熟。

从基础的匹配,到高级的分组、替换、全局变量,一套组合拳下来,大部分字符串处理任务都能轻松搞定。

掌握这些技巧,写代码的时候会顺手很多。

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多