正则表达式(Regular Expression,简称 Regex)是一种强大的文本匹配工具,可用于模式匹配、查找、替换等操作。在 Ruby 中,正则表达式通过 //
定义,并由 Regexp
类管理。
📌 目录
- 🔹 正则表达式基础
- 🔹 正则表达式的创建
- 🔹 正则表达式匹配方法
- 🔹 元字符(Metacharacters)
- 🔹 字符类(Character Classes)
- 🔹 量词(Quantifiers)
- 🔹 组(Groups)和反向引用
- 🔹 断言(Assertions)
- 🔹 正则表达式替换
- 🔹 正则表达式选项(修饰符)
- 🔹 参考资料
🔹 正则表达式基础
Ruby 的正则表达式由 Regexp
类表示,主要用于文本匹配、查找和替换。
示例:匹配 “Ruby” 这个单词
puts "I love Ruby" =~ /Ruby/ # 输出: 7(匹配的起始索引)
puts "I love Python" =~ /Ruby/ # 输出: nil(未匹配)
🔹 正则表达式的创建
1. 直接使用 /pattern/
regex = /hello/
puts "hello world" =~ regex # 输出: 0(匹配到 "hello" 在索引 0)
2. 使用 Regexp.new
创建
regex = Regexp.new("hello")
puts "hello world" =~ regex # 输出: 0
3. 使用 %r{pattern}
regex = %r{hello}
puts "hello world" =~ regex # 输出: 0
🔹 正则表达式匹配方法
方法 | 说明 | 示例 |
---|---|---|
=~ | 返回匹配位置索引,未匹配返回 nil | "Ruby" =~ /Ruby/ 结果 0 |
.match() | 返回 MatchData 对象,未匹配返回 nil | /Ruby/.match("I love Ruby") |
.scan() | 返回所有匹配项的数组 | "abc123".scan(/\d/) 结果 ["1", "2", "3"] |
.gsub() | 全局替换 | "abc123".gsub(/\d/, "#") 结果 "abc###" |
示例:
text = "Email: example@mail.com"
match = /(\w+@\w+\.\w+)/.match(text)
puts match[1] # 输出: example@mail.com
🔹 元字符(Metacharacters)
符号 | 作用 | 示例 |
---|---|---|
. | 任意字符(换行符除外) | "cat".match(/c.t/) ✅ |
^ | 以…开头 | /^Ruby/.match("Ruby is fun") ✅ |
$ | 以…结尾 | /fun$/.match("Ruby is fun") ✅ |
\d | 数字 [0-9] | /\d+/.match("abc123") ✅ |
\w | 单词字符 [a-zA-Z0-9_] | /\w+/ .match(“hello_123”) ✅ |
\s | 空白字符 | /\s+/ .match(“hello world”) ✅ |
示例:
puts "123abc" =~ /\d+/ # 匹配 "123",输出 0
puts "hello world" =~ /\s+/ # 匹配空格,输出 5
🔹 字符类(Character Classes)
符号 | 作用 | 示例 |
---|---|---|
[abc] | 匹配 a 或 b 或 c | /[aeiou]/.match("apple") ✅ |
[^abc] | 不匹配 a 、b 、c | /[^aeiou]/.match("apple") ✅ |
[a-z] | 匹配小写字母 | /[a-z]/.match("abc") ✅ |
[A-Z] | 匹配大写字母 | /[A-Z]/.match("ABC") ✅ |
[0-9] | 匹配数字 | /[0-9]/.match("123") ✅ |
示例:
puts "ruby123" =~ /[a-z]+/ # 匹配 "ruby"
puts "HELLO" =~ /[A-Z]+/ # 匹配 "HELLO"
🔹 量词(Quantifiers)
符号 | 作用 | 示例 |
---|---|---|
* | 0 次或多次 | "aaa".match(/a*/) ✅ |
+ | 1 次或多次 | "a".match(/a+/) ✅ |
? | 0 次或 1 次 | "abc".match(/a?/) ✅ |
{n} | 恰好 n 次 | "\d{3}" 匹配 "123" |
{n,} | 至少 n 次 | "\d{2,}" 匹配 "12" |
{n,m} | n 到 m 次 | "\d{2,4}" 匹配 "1234" |
示例:
puts "aaa" =~ /a+/ # 匹配 "aaa"
puts "12345" =~ /\d{2,4}/ # 匹配 "1234"
🔹 组(Groups)和反向引用
1. 组(()
)
text = "2025-03-22"
match = /(\d{4})-(\d{2})-(\d{2})/.match(text)
puts match[1] # 输出: 2025
puts match[2] # 输出: 03
puts match[3] # 输出: 22
2. 反向引用(\1
、\2
)
puts "hello hello" =~ /(\w+) \1/ # 匹配重复单词 "hello hello"
🔹 断言(Assertions)
符号 | 作用 | 示例 |
---|---|---|
?= | 正向先行断言 | /Ruby(?= is)/.match("Ruby is awesome") ✅ |
?! | 负向先行断言 | /Ruby(?! is)/.match("Ruby rocks") ✅ |
?<= | 正向后行断言 | /(?<=\$)\d+/.match("$100") ✅ |
?<! | 负向后行断言 | /(?<!\$)\d+/.match("100") ✅ |
🔹 正则表达式替换
puts "hello world".gsub(/world/, "Ruby") # 输出: hello Ruby
puts "abc123".sub(/\d+/, "#") # 输出: abc#
发表回复