+7

Làm quen với Regex (REGULAR EXPRESSION) trong Ruby

Mở đầu

Khi làm dự án mình thấy Regex được dùng rất nhiều trong kiểm tra validate của dữ liệu, ví dụ Khách hàng muốn ta nhập trường A chỉ chứa các gmail cách nhau bởi dấu phẩy. Vậy làm thế nào để có thể biết được dữ liệu người dùng nhập vào là hợp lệ??? Bài viết mình giới thiệu cơ bản về Regex để bạn làm quen dễ dàng với nó hơn 😄 Biểu thức chính quy (Tiếng anh: Regular Expression, viết tắt là regexp, regex hoặc regxp) là một chuỗi miêu tả một bộ các chuỗi khác theo những quy tắc cú pháp nhất định dùng để phân tích, so sánh sự trùng khớp của một tập chuỗi nào đó. Trong lập trình nó là công cụ mạnh mẽ trong việc xử lý xâu, dùng để kiểm tra tính hợp lệ của xâu. Trong Ruby để tạo ra regex với cú pháp /example/ hoặc %r{example} hoặc Regex.new. Nếu một chuỗi chứa mô hình phù hợp thì nó sẽ trả về là match. Ví dụ

/lorem/.match("lorem isum it")
=> #<MatchData "lorem">

Giờ chúng ta cùng tìm hiểu về regex qua các cú pháp cụ thể

Matching

Ngoài dùng match như trên để kiểm tra có dữ liệu có trùng khớp không. Ta có thể dùng nhiều cách khác nhau:

  1. Dùng ~=
"text sample" =~ /Ruby/  # Match khi trong string có chứa Ruby
"text sample" =~ /^Ruby/  # Match khi bắt đầu chuỗi là Ruby
"text sample" =~ /Ruby$/  # Match khi kết thúc chuỗi là Ruby
"text sample" =~ /^Ruby$/  # Match khi chuỗi là Ruby
  1. Dùng ===
/hello/ === "hello"
# true
  1. Dùng case when
case "hello"
when /hello/
    puts "Match"
 end
 # Match
  1. Sử dụng scan
"hello".scan(/hello/)
# ["hello"]

Patterns

  • ^ : match với chuỗi đầu tiên của dòng

  • $: match với từ chuỗi cuối cùng của dòng

  • [...]: Match với bất kì kí tự trong dấu ngoặc Có thể là các kí tự đơn lẻ [abc] : a , b hoặc c. 1 tập hợp các kí tự như [a-z]

  • [^..] : Match với bất kì kí tự nào trừ những kí tự trong ngoặc

  • a | b : Match với a hoặc b

  • \w: Match khi nó là kí tự

  • \W: Match tất cả trừ kí tự

  • \d: Match khi nó là số. tương đương từ [0-9]

  • \D: Match tất cả trừ số

Character classes

/[Rr]uby: Match chuỗi là Ruby hoặc ruby /[0-9]: Match với bất kì số nào, tương đương với câu lệnh /[0123456789]/ /[a-z]/: Match tất cả các chữ cái thường /[A-Z]/: Match tất cả các chữ cái viết hoa /[a-zA-Z0-9]/: Match với chữ cái thường, hoa và số /./: Match với tất cả trừ xuống dòng /./m: Match xét trên nhiều dòng (m: multi line)

Repetition

Các cấu trúc mô tả thường phù hợp với chuỗi duy nhất. Nó có thể kiểm tra matching xác định bao nhiêu lần nó cần phải xảy ra. metacharacters như vậy được gọi là định lượng (quantifiers.)

  • *Không hoặc nhiều lần
  • + Một hoặc nhiều lần
  • ? Không hoặc 1 lần
  • {n}: Chính xác n lần
  • {n,}: n lần hoặc nhiều hơn
  • {, m}: m lần hoặc ít hơn
  • {n,m}: ít nhất n lần và nhiều nhất là m lần Ví dụ
/<.+>/.match("<a><b>")  #=> #<MatchData "<a><b>">
/<.+?>/.match("<a><b>") #=> #<MatchData "<a>">

Grouping

/(regex)/: Dùng dấu () giữa các regex: Ví dụ: (abc){3} sẽ match với "abcabcabc" /(regex1| regex2)/: Hoặc match với regex1 hoặc regex2

Search and Replace

Một trong những String method sử dụng phổ biến dùng regex là sub và gsub, sub!, gsub! Tất cả những method này đều thực hiện tìm kiếm và thay thế sử dụng Regex. sub và sub! thay thế phần tử đầu tiên được tìm thấy, còn gsub và gsub! thì thay thế tất cả các phần tử trùng khớp


phone = "2004-959-559 #This is Phone Number"

# Delete Ruby-style comments
phone = phone.sub!(/#.*$/, "")   
puts "Phone Num : #{phone}"
=> Phone Num : 2004-959-559

# Remove anything other than digits
phone = phone.gsub!(/\D/, "")    
puts "Phone Num : #{phone}"
=> Phone Num : 2004959559

 text = "Ruby on rails"
 text.gsub!("rails", "Rails")
 => "Ruby on Rails"

Example

Một số ví dụ về sử dụng regex để kiểm tra hợp lệ của Password:

  • ^[a-z0-9\.@#\$%&]+$/ : Bao gồm các kí tự a-z, chữ số 0-9, và các kí tự đặc biệt @#$%&
  • ^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$ Ít nhất 8 kí tự trong đó có ít nhất 1 chữ cái và 1 số
  • / ^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{8,}/ Ít nhất 8 kí tự trong đó có ít nhất 1 chữ cái in hoa, 1 chữ cái in thường, 1 số và 1 kí tự đặc biệt
  • / ^[a-zA-Z0-9\s]{7,16}$/: ÍT nhất 7 kí tự và nhiều nhất 16 kí tự cho phép 0-9, a-z

Hi vọng bài viết sẽ giúp ích cho bạn

Nguồn tham khảo https://www.blueboxcloud.com/insight/blog-article/using-regular-expressions-in-ruby-part-1-of-3 https://ruby-doc.org/core-2.1.1/Regexp.html https://www.tutorialspoint.com/ruby/ruby_regular_expressions.htm http://www.c-sharpcorner.com/UploadFile/ee01e6/important-list-of-regular-expressions-and-its-uses/


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí