Vài câu lệnh regex căn bản với Ruby
Bài đăng này đã không được cập nhật trong 8 năm
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