Vài câu lệnh regex căn bản với Ruby

Tìm vị trí trong chuỗi khớp với pattern

s = "/usr/etc"
idx = s =~ /etc/
# => 5

s =~ /etc/ sẽ trả về:

  • Vị trí đầu tiên trong chuỗi s khớp với pattern /etc/.
  • Nếu không khớp thì kết quả là nil.

Kiểm tra xem có khớp với pattern không

s = "/usr/etc"
if s =~ /etc/
  puts "condition satisfied"
else
  puts "not satisfied"
end
# => condition satisfied

Đoạn mã trên giống đoạn mã ở phần "tìm vị trí". Lí do là điều kiện if sẽ thỏa mãn ngay cả kết quả trả về là số 0 (vị trí đầu tiên trong chuỗi). Nếu không khớp, kết quả là nil, thì if sẽ không thỏa mãn.

Thay thế

"abc".gsub(/b/, "d")
#  => "adc"

Trích

s = "xxx yyy zzz"
s =~ /^(.+) .+? (.+)/

puts $1
#  => "xxx"

puts $2
#  => "zzz"

Để trích ra ta dùng dấu ngoặc. Nếu khớp, phần dấu ngoặc đầu tiên sẽ được trích ra thành biếtn $1. Tương tự với $2.

Backreference

Chiêu backreference này hơi cao một chút.

Giả sử bạn muốn khớp với pattern chuỗi gì đó được kẹp giữa 2 dấu " (nháy kép) hoặc 2 dấu '(nháy đơn).

Nếu viết là:

s = '"Hello"'
s =~ /("|')(.*?)("|')/
puts $2
# => Hello

Thì ngoài khớp với "Hello" và 'Hello', nó sẽ khớp với cả "Hello' và 'Hello".

Ta sửa lại thành:

s =~ /("|')(.*?)\1/

\1 diễn tả là cái trong dấu ngoặc đầu tiên sẽ được trích ra, cho phép ta dùng tiếp nó vào trong pattern. Đó là lí do chiêu này gọi là "back" và "reference".


All Rights Reserved