正则表达式
=~ 匹配、sub/gsub/scan、捕获组、Regexp.new
正则表达式
Ruby 的正则用 =~ 匹配、sub/gsub 替换、scan 提取——简洁而强大。
学完本章你将: 掌握 =~ 匹配、sub/gsub/scan、捕获组。
匹配
ruby
# =~ 返回匹配位置(nil 表示不匹配)
"Hello" =~ /ll/ # 2
"Hello" =~ /xx/ # nil
# match —— 返回 MatchData
m = "Hello World".match(/Wo(..)d/)
m[0] # "World"(完整匹配)
m[1] # "rl"(第一个捕获组)
# match? —— 返回布尔(Ruby 2.4+)
"Hello".match?(/ll/) # true
替换
ruby
# sub —— 替换第一个
"Hello World".sub(/o/, "0") # "Hell0 World"
# gsub —— 替换所有
"Hello World".gsub(/o/, "0") # "Hell0 W0rld"
# 块形式
"Hello".gsub(/\w+/) { |m| m.upcase } # "HELLO"
scan —— 提取所有匹配
ruby
"a1b2c3".scan(/\d/) # ["1", "2", "3"]
"a1b2c3".scan(/(\w)(\d)/) # [["a","1"], ["b","2"], ["c","3"]]
捕获组与命名组
ruby
# 捕获组
m = "2024-07-23".match(/(\d{4})-(\d{2})-(\d{2})/)
m[1] # "2024"
m[2] # "07"
m[3] # "23"
# 命名组
m = "2024-07-23".match(/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/)
m[:year] # "2024"
m[:month] # "07"