Regular Expressions (Regex) là một công cụ mạnh mẽ trong lập trình, cho phép bạn tìm kiếm, kiểm tra và thao tác với các chuỗi ký tự theo các mẫu cụ thể. Trong Ruby, Regex được sử dụng rộng rãi để xử lý văn bản, từ việc kiểm tra định dạng email đến việc trích xuất dữ liệu từ các tệp nhật ký. Bài viết này sẽ đi sâu vào các khía cạnh của Regular Expressions trong Ruby, bao gồm cú pháp, các bộ điều chỉnh (modifiers), các mẫu biểu thức (patterns), tìm kiếm và thay thế, và nhiều hơn nữa.
Cú pháp (Syntax)
Trong Ruby, một Regular Expression được định nghĩa giữa hai dấu gạch chéo /.../
hoặc bằng cách sử dụng cú pháp %r{...}
. Bạn cũng có thể sử dụng phương thức Regexp.new
để tạo một đối tượng Regex.
ruby
# Định nghĩa một Regex bằng dấu gạch chéo
regex1 = /hello/
# Định nghĩa một Regex bằng cú pháp %r{}
regex2 = %r{hello}
# Định nghĩa một Regex bằng phương thức Regexp.new
regex3 = Regexp.new("hello")
Các bộ điều chỉnh (Regular-Expression Modifiers)
Bộ điều chỉnh (modifier) là các ký tự đặc biệt được thêm vào cuối biểu thức Regex để thay đổi cách nó hoạt động. Dưới đây là một số bộ điều chỉnh phổ biến trong Ruby:
i
: Không phân biệt chữ hoa chữ thường.m
: Cho phép dấu chấm.
khớp với ký tự xuống dòng.x
: Bỏ qua khoảng trắng và cho phép thêm chú thích trong Regex.o
: Thực hiện thay thế#{...}
chỉ một lần.
ruby
# Không phân biệt chữ hoa chữ thường
regex = /hello/i
puts "Hello".match?(regex) # Output: true
# Cho phép dấu chấm khớp với ký tự xuống dòng
regex = /a.b/m
puts "a\nb".match?(regex) # Output: true
# Bỏ qua khoảng trắng và cho phép thêm chú thích
regex = /
a # Ký tự a
b # Ký tự b
/x
puts "ab".match?(regex) # Output: true
Các mẫu biểu thức (Regular-Expression Patterns)
Các mẫu biểu thức Regex cho phép bạn xác định các ký tự hoặc chuỗi ký tự cụ thể mà bạn muốn tìm kiếm. Dưới đây là một số mẫu biểu thức phổ biến:
.
: Bất kỳ ký tự nào ngoại trừ ký tự xuống dòng.\d
: Bất kỳ chữ số nào (0-9).\w
: Bất kỳ ký tự từ, chữ số hoặc dấu gạch dưới.\s
: Bất kỳ ký tự khoảng trắng nào.^
: Bắt đầu của chuỗi.$
: Kết thúc của chuỗi.[abc]
: Bất kỳ ký tự nào trong tập hợpa
,b
, hoặcc
.[^abc]
: Bất kỳ ký tự nào không nằm trong tập hợpa
,b
, hoặcc
.a|b
:a
hoặcb
.a*
: Không hoặc nhiều lần xuất hiện củaa
.a+
: Một hoặc nhiều lần xuất hiện củaa
.a?
: Không hoặc một lần xuất hiện củaa
.a{3}
: Chính xác 3 lần xuất hiện củaa
.a{3,}
: Ít nhất 3 lần xuất hiện củaa
.a{3,6}
: Từ 3 đến 6 lần xuất hiện củaa
.
ruby
# Ví dụ về các mẫu biểu thức
puts "abc".match?(/a.c/) # Output: true
puts "123".match?(/\d+/) # Output: true
puts "hello_world".match?(/\w+/) # Output: true
puts " \t\n".match?(/\s+/) # Output: true
puts "start".match?(/^start/) # Output: true
puts "end".match?(/end$/) # Output: true
puts "a".match?(/[abc]/) # Output: true
puts "d".match?(/[^abc]/) # Output: true
puts "a".match?(/a|b/) # Output: true
puts "aaa".match?(/a*/) # Output: true
puts "aaa".match?(/a+/) # Output: true
puts "a".match?(/a?/) # Output: true
puts "aaa".match?(/a{3}/) # Output: true
puts "aaaa".match?(/a{3,}/) # Output: true
puts "aaaa".match?(/a{3,6}/) # Output: true
Tìm kiếm và thay thế (Search and Replace)
Ruby cung cấp các phương thức sub
và gsub
để thực hiện tìm kiếm và thay thế trong chuỗi sử dụng Regex. Phương thức sub
thay thế lần xuất hiện đầu tiên của mẫu, trong khi gsub
thay thế tất cả các lần xuất hiện.
ruby
text = "The quick brown fox jumps over the lazy dog."
# Thay thế lần xuất hiện đầu tiên của "fox" bằng "cat"
new_text = text.sub(/fox/, "cat")
puts new_text # Output: The quick brown cat jumps over the lazy dog.
# Thay thế tất cả các lần xuất hiện của "the" bằng "a"
new_text = text.gsub(/the/i, "a")
puts new_text # Output: a quick brown fox jumps over a lazy dog.
Nhóm và tham chiếu lại (Grouping and Backreferences)
Nhóm (grouping) cho phép bạn nhóm các phần của biểu thức Regex lại với nhau bằng cách sử dụng dấu ngoặc đơn ()
. Bạn có thể tham chiếu lại các nhóm này trong biểu thức hoặc trong chuỗi thay thế bằng cách sử dụng ký tự $
hoặc \
.
ruby
text = "The quick brown fox jumps over the lazy dog."
# Nhóm và tham chiếu lại
new_text = text.gsub(/(quick) (brown) (fox)/, '\1 \2 cat')
puts new_text # Output: The quick brown cat jumps over the lazy dog.
Các phương thức Regex trong Ruby
Ruby cung cấp nhiều phương thức để làm việc với Regex, bao gồm:
=~
: Trả về chỉ số của lần xuất hiện đầu tiên của mẫu trong chuỗi hoặcnil
nếu không tìm thấy.match
: Trả về một đối tượngMatchData
chứa thông tin về lần xuất hiện đầu tiên của mẫu trong chuỗi hoặcnil
nếu không tìm thấy.scan
: Trả về một mảng chứa tất cả các lần xuất hiện của mẫu trong chuỗi.split
: Chia chuỗi thành một mảng các chuỗi con dựa trên mẫu.
ruby
text = "The quick brown fox jumps over the lazy dog."
# Sử dụng =~
index = text =~ /fox/
puts index # Output: 16
# Sử dụng match
match_data = text.match(/quick (brown) (fox)/)
puts match_data[0] # Output: quick brown fox
puts match_data[1] # Output: brown
puts match_data[2] # Output: fox
# Sử dụng scan
words = text.scan(/\w+/)
puts words.inspect # Output: ["The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"]
# Sử dụng split
parts = text.split(/\s+/)
puts parts.inspect # Output: ["The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"]
Các ví dụ nâng cao
Kiểm tra định dạng email
ruby
email = "test@example.com"
valid = !!email.match(/\A[\w.+-]+@\w+\.\w+\z/)
puts valid # Output: true
Trích xuất số từ chuỗi
ruby
text = "The year was 1492."
numbers = text.scan(/\d+/)
puts numbers.inspect # Output: ["1492"]
Chuyển đổi chữ hoa thành chữ thường
ruby
text = "Hello World"
new_text = text.gsub(/\w+/) { |word| word.downcase }
puts new_text # Output: hello world
Kết luận
Regular Expressions là một công cụ mạnh mẽ và linh hoạt trong Ruby, cho phép bạn tìm kiếm, kiểm tra và thao tác với các chuỗi ký tự theo các mẫu cụ thể. Bằng cách sử dụng các cú pháp, bộ điều chỉnh, mẫu biểu thức, và các phương thức Regex trong Ruby, bạn có thể thực hiện các tác vụ xử lý văn bản một cách hiệu quả và dễ dàng. Hãy tiếp tục khám phá và thực hành với Regular Expressions trong Ruby để trở thành một lập trình viên giỏi hơn.