07/09/2018, 16:01

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

0