Khóa học ruby

Regular Expressions trong Ruby

0 phút đọc

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.

# Đị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.
# 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ợp a, b, hoặc c.
  • [^abc]: Bất kỳ ký tự nào không nằm trong tập hợp a, b, hoặc c.
  • a|b: a hoặc b.
  • a*: Không hoặc nhiều lần xuất hiện của a.
  • a+: Một hoặc nhiều lần xuất hiện của a.
  • a?: Không hoặc một lần xuất hiện của a.
  • a{3}: Chính xác 3 lần xuất hiện của a.
  • a{3,}: Ít nhất 3 lần xuất hiện của a.
  • a{3,6}: Từ 3 đến 6 lần xuất hiện của a.
# 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 subgsub để 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.

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 \.

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ặc nil nếu không tìm thấy.
  • match: Trả về một đối tượng MatchData chứa thông tin về lần xuất hiện đầu tiên của mẫu trong chuỗi hoặc nil 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.
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

email = "test@example.com"
valid = !!email.match(/\A[\w.+-]+@\w+\.\w+\z/)
puts valid  # Output: true

Trích xuất số từ chuỗi

text = "The year was 1492."
numbers = text.scan(/\d+/)
puts numbers.inspect  # Output: ["1492"]

Chuyển đổi chữ hoa thành chữ thường

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.

Avatar
Được viết bởi

TechMely Team

Gợi ý câu hỏi phỏng vấn

entry

Ruby on Rails là gì?

entry

Is there an equivalent of “continue” in Ruby?

entry

Is everything in Ruby an object?

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào