Cocokkan pola dengan ekspresi reguler

Selesai

Tip

Lihat tab Teks dan gambar untuk detail selengkapnya!

Pemrosesan teks dalam database sering memerlukan pencocokan pola yang melampaui apa yang dapat ditangani LIKE operator. Ekspresi reguler menyediakan sintaksis standar untuk pencocokan pola kompleks, validasi, dan transformasi teks. Database SQL Server 2025 dan SQL di Microsoft Fabric menyertakan dukungan ekspresi reguler melalui fungsi T-SQL baru.

Pertimbangkan skenario saat LIKE tidak memadai: ketika seseorang memvalidasi alamat email yang formatnya benar, mengekstrak nomor telepon terlepas dari variasi formatnya, menemukan kode produk yang mengikuti konvensi penamaan tertentu, atau mendeteksi pola seperti karakter yang berulang secara berurutan. Operator LIKE hanya mendukung wildcard sederhana (% untuk karakter apa pun, _ untuk satu karakter), yang tidak dapat mengekspresikan pola kompleks ini.

Ekspresi reguler menyelesaikan batasan ini dengan menyediakan bahasa pola yang kaya. Dengan regex, Anda dapat mencocokkan rentang karakter tertentu, memerlukan pengulangan dalam jumlah yang tepat, menggunakan alternatif (mencocokkan ini ATAU itu), dan menangkap bagian dari teks yang cocok untuk diekstraksi atau diganti. Setelah mempelajari sintaks regex, Anda dapat menerapkannya di banyak bahasa dan alat pemrograman—pola yang Anda tulis untuk SQL Server berfungsi sama seperti di utilitas Python, JavaScript, dan baris perintah.

Memahami dasar-dasar ekspresi reguler

Ekspresi reguler (regex) menggunakan sintaks pola untuk menggambarkan pola teks. Sebelum Anda mempelajari fungsi SQL Server, mari kita tinjau komponen regex umum ini:

Pola Deskripsi Contoh Kecocokan
. Setiap karakter tunggal a.c cocok dengan "abc", "a1c"
* Nol atau lebih sebelumnya ab*c cocok untuk "ac", "abc", "abbc"
+ Satu atau beberapa sebelumnya ab+c mencocokkan "abc", "abbc", tetapi tidak "ac"
? Nol atau salah satu dari sebelumnya colou?r cocok dengan "warna", "warna"
^ Mulai dari string ^Hello cocok dengan string yang dimulai dengan "Halo"
$ Akhir string world$ mencocokkan string yang berakhir dengan "world"
[abc] Kelas karakter [aeiou] cocok dengan vokal apa pun
[^abc] Kelas yang dinegasikan [^0-9] cocok dengan nondigit
\d Angka (0-9) \d{3} cocok dengan tiga digit
\w Karakter kata \w+ cocok dengan karakter kata
{n} Kemunculan tepat sebanyak n kali \d{4} cocok dengan tepat empat digit
{n,m} Antara jumlah kemunculan n dan m \d{2,4} cocok dengan 2 hingga 4 digit

Nota

Fungsi ekspresi reguler SQL Server menggunakan sintaks regex standar ECMAScript . Skrip ini menggunakan sintaks yang sama seperti yang digunakan dalam JavaScript dan banyak bahasa pemrograman lainnya, sehingga pola dapat diterapkan lintas teknologi.

Cocokkan pola dengan REGEXP_LIKE

REGEXP_LIKE mengembalikan 1 (true) jika string cocok dengan pola ekspresi reguler, atau 0 (false) jika tidak. Gunakan fungsi ini dalam WHERE klausa untuk memfilter baris berdasarkan pola kompleks:

-- Find customers with email addresses from specific domains
SELECT CustomerID, FirstName, LastName, EmailAddress
FROM SalesLT.Customer
WHERE REGEXP_LIKE(EmailAddress, '@(contoso|adventure-works|fabrikam)\.com$') = 1;

Memvalidasi format data:

-- Find valid US phone numbers (various formats)
SELECT CustomerID, Phone
FROM SalesLT.Customer
WHERE REGEXP_LIKE(Phone, '^\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}$') = 1;

-- Validate product numbers match expected format (XX-XXXX)
SELECT ProductID, ProductNumber, Name
FROM SalesLT.Product
WHERE REGEXP_LIKE(ProductNumber, '^[A-Z]{2}-[A-Z0-9]{4,6}$') = 1;

Gunakan pencocokan tidak peka huruf besar/kecil dengan parameter bendera:

-- 'i' flag enables case-insensitive matching
SELECT Name
FROM SalesLT.Product
WHERE REGEXP_LIKE(Name, 'frame', 'i') = 1;

Tip

Gunakan REGEXP_LIKE untuk validasi dan pemfilteran. Ini lebih efisien daripada mengekstrak substring ketika Anda hanya perlu tahu apakah ada pola.

Ganti teks dengan REGEXP_REPLACE

REGEXP_REPLACE menemukan semua kemunculan pola dan menggantinya dengan string yang ditentukan. Fungsi ini berguna untuk pembersihan dan standardisasi data:

-- Standardize phone numbers to (XXX) XXX-XXXX format
SELECT 
    Phone AS OriginalPhone,
    REGEXP_REPLACE(
        REGEXP_REPLACE(Phone, '[^\d]', ''),  -- First remove all non-digits
        '^(\d{3})(\d{3})(\d{4})$',
        '($1) $2-$3'
    ) AS StandardizedPhone
FROM SalesLT.Customer
WHERE Phone IS NOT NULL;

Contoh berikut menunjukkan cara menggunakan grup pengambilan dengan referensi balik:

-- Swap first and last name
DECLARE @name NVARCHAR(100) = 'Smith, John';
SELECT REGEXP_REPLACE(@name, '^(\w+),\s*(\w+)$', '$2 $1') AS SwappedName;
-- Returns: John Smith

-- Mask credit card numbers (show last 4 digits only)
DECLARE @card NVARCHAR(20) = '4532-1234-5678-9012';
SELECT REGEXP_REPLACE(@card, '\d(?=[\d-]{4,})', '*') AS MaskedCard;
-- Returns: ****-****-****-9012

Contoh berikut menunjukkan cara membersihkan dan menormalkan data:

-- Remove extra whitespace (multiple spaces to single space)
SELECT REGEXP_REPLACE(Description, '\s+', ' ') AS CleanedDescription
FROM Products;

-- Remove HTML tags
SELECT REGEXP_REPLACE(HtmlContent, '<[^>]+>', '') AS PlainText
FROM WebPages;

Ekstrak substring dengan REGEXP_SUBSTR

REGEXP_SUBSTR mengekstrak bagian string yang cocok dengan pola ekspresi reguler. Gunakan untuk menarik elemen data tertentu dari teks yang tidak terstruktur seperti contoh berikut:

-- Extract domain from email address
SELECT 
    EmailAddress,
    REGEXP_SUBSTR(EmailAddress, '@(.+)$', 1, 1, '', 1) AS Domain
FROM SalesLT.Customer
WHERE EmailAddress IS NOT NULL;

-- Extract the first number from a string
SELECT 
    ProductNumber,
    REGEXP_SUBSTR(ProductNumber, '\d+') AS FirstNumber
FROM SalesLT.Product;

Contoh berikut menunjukkan tanda tangan fungsi, yang mencakup parameter untuk kemunculan dan grup pengambilan:

REGEXP_SUBSTR(source, pattern, start_position, occurrence, flags, capture_group)

Menemukan posisi pola dengan REGEXP_INSTR

REGEXP_INSTR mengembalikan posisi awal kecocokan pola dalam string. Mengembalikan 0 jika tidak ada kecocokan yang ditemukan, seperti contoh berikut:

-- Find position of first digit in product number
SELECT 
    ProductNumber,
    REGEXP_INSTR(ProductNumber, '\d') AS FirstDigitPosition
FROM SalesLT.Product;

-- Find position of email domain
SELECT 
    EmailAddress,
    REGEXP_INSTR(EmailAddress, '@') AS AtPosition,
    REGEXP_INSTR(EmailAddress, '\.[a-z]+$', 1, 1, 0, 'i') AS TldPosition
FROM SalesLT.Customer
WHERE EmailAddress IS NOT NULL;

Menghitung kemunculan pola dengan REGEXP_COUNT

REGEXP_COUNT mengembalikan berapa kali pola muncul dalam string. Contoh berikut mengilustrasikan penggunaannya:

-- Count words in a description
SELECT  
    Name,
    REGEXP_COUNT(Name, '\w+') AS WordCount
FROM SalesLT.Product;

-- Count vowels in product names
SELECT 
    Name,
    REGEXP_COUNT(Name, '[aeiou]', 1, 'i') AS VowelCount
FROM SalesLT.Product;

-- Find products with multiple numbers in their name
SELECT Name
FROM SalesLT.Product
WHERE REGEXP_COUNT(Name, '\d+') > 1;

Memisahkan string dengan REGEXP_SPLIT_TO_TABLE

REGEXP_SPLIT_TO_TABLE adalah fungsi bernilai tabel yang membagi string menjadi baris berdasarkan pola pemisah:

-- Split comma-separated values
DECLARE @tags NVARCHAR(200) = 'sql,database,azure,analytics';
SELECT value AS Tag
FROM REGEXP_SPLIT_TO_TABLE(@tags, ',');

-- Split on multiple delimiters (comma, semicolon, or pipe)
DECLARE @data NVARCHAR(200) = 'apple,banana;cherry|date';
SELECT value AS Fruit
FROM REGEXP_SPLIT_TO_TABLE(@data, '[,;|]');

Anda dapat menggabungkan REGEXP_SPLIT_TO_TABLE dengan kueri lain menggunakan CROSS APPLY:

-- Assuming Products table has a Tags column with comma-separated values
SELECT 
    p.ProductID,
    p.Name,
    t.value AS Tag
FROM Products AS p
CROSS APPLY REGEXP_SPLIT_TO_TABLE(p.Tags, ',\s*') AS t;

Mengembalikan semua kecocokan dengan REGEXP_MATCHES

REGEXP_MATCHES adalah fungsi bernilai tabel yang mengembalikan semua kecocokan pola sebagai baris terpisah:

-- Find all numbers in a string
DECLARE @text NVARCHAR(200) = 'Order 12345 contains 3 items totaling $99.99';
SELECT match_value, match_index
FROM REGEXP_MATCHES(@text, '\d+\.?\d*');
-- Returns: 12345, 3, 99.99

Penting

Fungsi ekspresi reguler tersedia dalam database SQL Server 2025 dan SQL di Microsoft Fabric. Untuk versi SQL Server sebelumnya, pertimbangkan untuk menggunakan fungsi runtime bahasa umum (CLR) atau pemrosesan lapisan aplikasi untuk operasi regex yang kompleks.

Untuk informasi selengkapnya tentang fungsi ekspresi reguler, lihat Ekspresi reguler.