74 / 100

REGEXP

Muntazam ifodalar

Ushbu qo'llanmada PostgreSQLda matn qatorlarini qidirish va mosliklarni aniqlash uchun POSIX muntazam ifodalaridan (regular expressions) qanday foydalanishni o'rganasiz.

POSIX muntazam ifodalariga kirish

Muntazam ifoda (regular expression yoki regex) — bu qidiruv shablonini belgilaydigan belgilar ketma-ketligidir.

Masalan, \d+ muntazam ifodasi bir yoki bir nechta raqamga mos keladi. Ular aniq bir raqam emas, balki istalgan raqamlar bo'lishi mumkin. Masalan, "iPhone 15" matni \d muntazam ifodasiga mos tushadi.

PostgreSQL POSIX (Portable Operating System Interface) standarti tomonidan belgilangan POSIX muntazam ifodalarini qo'llab-quvvatlaydi.

POSIXdan tashqari yana bir mashhur standart Perl Compatible Regular Expressions (PCRE) hisoblanadi. PostgreSQL PCRE standartini to'g'ridan-to'g'ri o'z ichiga olmaydi, balki POSIX standartiga tayanadi.

Keling, POSIX muntazam ifodalari qanday ishlashini ko'rib chiqamiz.

Belgilar sinflari (Character Classes)

  • \d — istalgan raqamga mos keladi. Bu [0-9] ga teng.
  • \s — istalgan bo'sh joy (probel, tab va h.k.) belgisiga mos keladi.
  • \w — harflar, raqamlar va pastki chiziqni o'z ichiga olgan istalgan so'z belgisiga mos keladi. Bu [a-zA-Z0-9_] ga teng.
  • Katta harflar ushbu belgi sinflarini inkor etadi:
    • \D — raqam bo'lmagan istalgan belgiga mos keladi, [^0-9] ga teng.
    • \S — probel bo'lmagan istalgan belgiga mos keladi.
    • \W — so'z belgisi bo'lmagan istalgan belgiga mos keladi.

Boshlanish va tugash belgilari (Anchors)

Anchorlar aniq belgilarga emas, balki qatordagi o'rniga mos keladi:

  • ^ — qatorning boshlanishiga mos keladi.
  • $ — qatorning oxiriga mos keladi.

Miqdor ko'rsatkichlari (Quantifiers)

Quantifierlar belgilar to'plamining necha marta takrorlanishini belgilaydi:

  • * — 0 yoki undan ko'p marta.
  • + — 1 yoki undan ko'p marta.
  • ? — 0 yoki 1 marta.
  • {n} — aynan n marta.
  • {n,} — kamida n marta.
  • {n,m} — n dan m gacha bo'lgan oraliqda (n < m).

To'plamlar va oraliqlar (Sets & Ranges)

To'plamdagi istalgan bitta belgiga mos kelish uchun kvadrat qavslardan [] foydalaning. Masalan, [abc] belgisi a, b yoki c ga mos keladi.

Kvadrat qavs ichida oraliq belgilash uchun defis - ishlatiladi. Masalan, [a-z] — a dan z gacha bo'lgan kichik harflar oralig'i. [0-9] — 0 dan 9 gacha bo'lgan raqamlar oralig'i.

To'plam yoki oraliqni istisno qilish uchun qavs boshida ^ belgisini qo'llang. Masalan, [^0-9] raqamlardan tashqari istalgan belgiga mos tushadi.

Variantlar (Alternation)

Bir nechta variantdan birini tanlash uchun | (yoki / OR operatori) ishlatiladi. Masalan, a|b ifodasi a yoki b ga mos keladi.

PostgreSQL muntazam ifoda operatorlari

PostgreSQL POSIX muntazam ifodalarini tekshirish uchun quyidagi operatorlarni taqdim etadi:

  • ~ — shablon qator ichida mavjudligini tekshiradi (katta-kichik harfga sezgir / case-sensitive).
  • ~* — shablon qator ichida mavjudligini tekshiradi (katta-kichik harfga sezgir emas / case-insensitive).
  • !~ — shablon qator ichida mavjud emasligini tekshiradi (katta-kichik harfga sezgir).
  • !~* — shablon qator ichida mavjud emasligini tekshiradi (katta-kichik harfga sezgir emas).

Namunaviy jadval

Misollarni bajarish uchun quyidagi products jadvalini yaratib olamiz:

query.sql
DROP TABLE IF EXISTS products;

CREATE TABLE products (
    product_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    product_name VARCHAR(100) NOT NULL
);

INSERT INTO products (product_name) VALUES
('Samsung QN900C Neo QLED'),
('Sony HT-A7000 Soundbar'),
('HP Spectre x360'),
('Samsung Galaxy S24'),
('Huawei Mate 60'),
('Apple iPhone 15'),
('Samsung Galaxy Z Fold 5'),
('Apple iPhone 15 Pro Max'),
('Samsung Galaxy Tab S9'),
('Samsung Galaxy Buds Pro 2'),
('Samsung Galaxy Watch 6'),
('Xiaomi Mi 14'),
('Dell XPS 15'),
('Dell Inspiron 27'),
('Bose SoundLink Max');

PostgreSQL muntazam ifodalari bo'yicha misollar

1) Belgilar sinflariga moslikni qidirish

Quyidagi so'rov moslik operatori ~ dan foydalanib, nomi ketma-ket uchta raqamdan iborat bo'lgan mahsulotlarni topadi:

query.sql
SELECT
  product_name
FROM
  products
WHERE
  product_name ~ '\d{3}';

Natija:

matn
      product_name       
-------------------------
 Samsung QN900C Neo QLED
 Sony HT-A7000 Soundbar
 HP Spectre x360

Quyidagi so'rov S harfi va undan keyin aynan ikki xonali raqam kelgan mahsulotlarni qidiradi (S\d{2}):

query.sql
SELECT
  product_name
FROM
  products
WHERE
  product_name ~ 'S\d{2}';

Natija:

matn
    product_name    
--------------------
 Samsung Galaxy S24

2) Matn boshlanishi va tugashini qidirish

Quyidagi so'rov moslik operatori ~ yordamida nomi H harfi bilan boshlanadigan mahsulotlarni tanlaydi:

query.sql
SELECT
  product_name
FROM
  products
WHERE
  product_name ~ '^H';

Natija:

matn
  product_name  
----------------
 Huawei Mate 60
 HP Spectre x360

Quyidagi so'rov nomi oxirida ikkita raqam bilan tugaydigan mahsulotlarni topadi:

query.sql
SELECT
  product_name
FROM
  products
WHERE
  product_name ~ '\d{2}$';

Natija:

matn
    product_name    
--------------------
 Samsung Galaxy S24
 Apple iPhone 15
 Huawei Mate 60
 Xiaomi Mi 14
 Dell XPS 15
 HP Spectre x360
 Dell Inspiron 27

3) iPhone yoki Galaxy so'zlarini qidirish

Quyidagi so'rov ~ operatori yordamida nomi ichida "iPhone" yoki "Galaxy" so'zlari mavjud mahsulotlarni chiqaradi:

query.sql
SELECT
  product_name
FROM
  products
WHERE
  product_name ~ 'iPhone|Galaxy';

Natija:

matn
        product_name        
----------------------------
 Samsung Galaxy S24
 Apple iPhone 15
 Samsung Galaxy Z Fold 5
 Apple iPhone 15 Pro Max
 Samsung Galaxy Tab S9
 Samsung Galaxy Buds Pro 2
 Samsung Galaxy Watch 6

Katta va kichik harflarni farqlamasdan (case-insensitive) qidirish uchun ~* operatoridan foydalanishingiz mumkin:

query.sql
SELECT
  product_name
FROM
  products
WHERE
  product_name ~* 'iphone|galaxy';

Natija:

matn
        product_name        
----------------------------
 Samsung Galaxy S24
 Apple iPhone 15
 Samsung Galaxy Z Fold 5
 Apple iPhone 15 Pro Max
 Samsung Galaxy Tab S9
 Samsung Galaxy Buds Pro 2
 Samsung Galaxy Watch 6

4) Shablonga mos kelmaydigan qatorlarni topish

Quyidagi so'rov !~ operatori yordamida nomida hech qanday raqam (\d+) bo'lmagan mahsulotlarni topadi:

query.sql
SELECT
  product_name
FROM
  products
WHERE
  product_name !~ '\d+';

Natija:

matn
    product_name    
--------------------
 Bose SoundLink Max

Xulosa

  • PostgreSQL POSIX standartidagi muntazam ifodalarni (regex) to'liq qo'llab-quvvatlaydi.
  • Matn shablonga mosligini tekshirish uchun ~, ~*, !~, va !~* operatorlaridan foydalaniladi.
  • \d, \s, \w kabi sinflar, ^ va $ anchorlari hamda miqdor ko'rsatkichlari yordamida istalgan murakkablikdagi qidiruv shablonlarini shakllantirish mumkin.