Regular Expressions (muntazam ifodalar) — matn ichida naqsh (pattern) qidirish uchun maxsus til. Ruby’da ular tilning o’ziga chuqur singdirilgan — maxsus klass va bir nechta qulay operator orqali qo’llab-quvvatlanadi.
Regexp —
/naqsh/shaklida yoziladigan, matn ichidan muayyan shablonga mos qismni qidirish yoki almashtirish uchun ishlatiladigan klass.
Oddiy moslik tekshirish
Eng sodda holat — matn muayyan naqshga mos keladimi tekshirish. Buning uchun match? ishlatiladi:
email = "[email protected]"
puts email.match?(/@/)
puts email.match?(/\d/)
true
false
/@/ — matnda @ belgisi bormi tekshiradi. \d — istalgan raqamni bildiruvchi maxsus belgi; bizning email matnida raqam yo’q, shuning uchun false.
match va MatchData
match metodi shunchaki true/false emas, topilgan qism haqida to’liq ma’lumot beruvchi MatchData obyektini qaytaradi:
matn = "Buyurtma raqami: 48213"
natija = matn.match(/\d+/)
puts natija[0]
puts natija.pre_match
48213
Buyurtma raqami:
\d+ — bitta yoki undan ko’p ketma-ket raqamni bildiradi. natija[0] — topilgan mos qismning o’zi, pre_match esa topilgan qismgacha bo’lgan matnni qaytaradi. Agar mos kelish topilmasa, match nil qaytaradi.
gsub — naqsh bo’yicha almashtirish
gsub matndagi naqshga mos kelgan barcha qismlarni almashtiradi:
telefon = "Tel: 90-123-45-67"
tozalangan = telefon.gsub(/[^0-9]/, "")
puts tozalangan
901234567
[^0-9] — “raqam bo’lmagan har qanday belgi” degan ma’noni bildiradi (^ qavs ichida “inkor” ma’nosini beradi). gsub shunday belgilarning barchasini bo’sh satr bilan almashtirib, faqat raqamlarni qoldirdi.
Qamrab olish guruhlari (capture groups)
Qavs ichiga olingan qism naqshning alohida “qamrab olingan” bo’lagiga aylanadi — bu, masalan, sanani qismlarga ajratishda foydali:
sana = "2026-07-02"
mos = sana.match(/(\d{4})-(\d{2})-(\d{2})/)
puts "Yil: #{mos[1]}"
puts "Oy: #{mos[2]}"
puts "Kun: #{mos[3]}"
Yil: 2026
Oy: 07
Kun: 02
\d{4} — aynan 4 ta ketma-ket raqam. Har bir qavs ((...)) alohida guruh hosil qildi — mos[1], mos[2], mos[3] orqali ularga alohida-alohida murojaat qilindi.
scan — barcha moslarni yig’ish
Naqshga mos keluvchi hamma qismlarni bitta massivga yig’ish uchun scan ishlatiladi:
matn = "Narxlar: 15000, 27500 va 9000 so'm"
sonlar = matn.scan(/\d+/)
puts sonlar.inspect
puts sonlar.map(&:to_i).sum
["15000", "27500", "9000"]
51500
scan matndagi barcha \d+ moslarini satr sifatida massivga yig’di. map(&:to_i) har birini songa aylantirdi, sum esa yig’indini hisobladi — regex va massiv metodlarining amaliy birikuvi.