详解Ruby中正则表达式对字符串的匹配和替换操作
Ruby正则表达式主要方法:`=~`返回匹配起始索引(整数或nil),`match`返回匹配结果对象(可用`[0]`或分组名),`scan`返回所有匹配组成的数组。分组捕获可通过`$1`等全局变量或MatchData对象获取。字符串替换:`sub`替换首次匹配,`gsub`替换全部。此外,`$``、`$'`和`$&`分别表示匹配前、后和匹配文本。
正则匹配

提到Ruby,正则表达式绝对是个绕不开的话题。它就像一把瑞士军刀,从简单的字符串验证,到复杂的网页内容抽取,几乎无所不能。虽然总有人抱怨正则的效率,但考虑到它那令人发指的匹配能力,这点代价完全值得。
说到Ruby的正则,最核心的就是两个匹配方法:=~ 和 match。两者有什么区别?咱们直接上代码看效果。
先聊聊 =~,它的用法非常直接:
message="afhadhffkdf414j"
regex=/[a-z](d{3})[a-z]/
puts regex=~message
Ruby里用 // 来定义正则表达式。这段代码想匹配的是:三个连续数字,两边各紧挨着一个小写字母。运行一下,猜猜输出是什么?是 10。为什么是10?因为 =~ 返回的是匹配结果在字符串中首次出现的位置(从0开始计数)。算一下,第10个字符正好是那个匹配的起点,非常直观。
再看 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 才是正确的选择。
问题来了:如果字符串里有多个符合规则的片段怎么办?上面那种写法只会匹配到第一个。受Ja va影响,一开始我总以为 match 会返回一个集合,折腾半天没搞定。其实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
简洁高效,所有匹配结果一次性到手。
正则表达式的分组
分组是正则里特别实用的功能。不仅能把表达式拆成逻辑单元,还能在匹配成功后通过 $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的正则生态非常成熟,从基础的匹配到高级的分组、替换、全局变量,一套组合拳下来,大部分字符串处理任务都能轻松搞定。掌握这些技巧,写代码的时候会顺手很多。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















