Z
ZHANK
工程化

正则表达式

=~ 匹配、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"