Vài chiêu regex căn bản với Ruby
Lúc trước mình được bạn trangia61 chia sẻ những chiêu này. 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. s = "/usr/etc" if s =~ /etc/ puts "condition satisfied" else puts ...
Lúc trước mình được bạn trangia61 chia sẻ những chiêu này.
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.
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.
"abc".gsub(/b/, "d") # => "adc"
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.
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".