Desenleri normal ifadelerle eşleştirme

Tamamlandı

Veritabanlarında metin işleme sıklıkla, LIKE işlecin kapasitesini aşan desen eşleştirmeyi gerektirir. Normal ifadeler karmaşık desen eşleştirme, doğrulama ve metin dönüştürme için standartlaştırılmış bir söz dizimi sağlar. Microsoft Fabric'teki SQL Server 2025 ve SQL veritabanları, yeni T-SQL işlevleri aracılığıyla normal ifade desteği içerir.

LIKE yetersiz kaldığında ortaya çıkan senaryoları göz önünde bulundurun: e-posta adreslerini uygun formatta doğrulama, biçimlendirmeden bağımsız olarak telefon numaralarını ayıklama, belirli adlandırma kurallarına uyan ürün kodlarını bulma veya art arda tekrarlanan karakterler gibi desenleri algılama. işleci LIKE yalnızca basit joker karakterleri (% herhangi bir karakter için, _ tek bir karakter için) destekler ve bu karmaşık desenleri ifade etmez.

Normal ifadeler, zengin bir desen dili sağlayarak bu sınırlamaları çözer. Regex ile belirli karakter aralıklarını eşleştirebilir, tam yineleme sayıları gerektirebilir, alternasyon kullanabilir (bu veya şu ile eşleşir) ve ayıklama veya değiştirme için eşleşen metnin gruplarını yakalayabilirsiniz. Regex söz dizimini öğrendikçe, bunu birçok programlama diline ve aracına uygulayabilirsiniz; SQL Server için yazdığınız desenler Python, JavaScript ve komut satırı yardımcı programlarında benzer şekilde çalışır.

Normal ifadenin temellerini anlama

Normal ifadeler (regex), metin desenlerini açıklamak için bir desen söz dizimi kullanır. SQL Server'ın işlevlerini öğrenmeden önce şu yaygın regex bileşenlerini gözden geçirelim:

Desen Description Örnek Eşleşme
. Herhangi bir tek karakter a.c "abc", "a1c" ile eşleşir
* Öncekinin sıfır veya daha fazla sayıda tekrarı ab*c "ac", "abc", "abbc" ile eşleşir
+ Bir veya daha fazla önceki ab+c "abc", "abbc" ile eşleşir ancak "ac" ile eşleşmiyor
? Sıfır veya öncekilerden biri colou?r, "color", "colour" ile eşleşir
^ Dizenin başlangıcı ^Hello "Hello" ile başlayan dizelerle eşleşir
$ Dize sonu world$ "world" ile biten dizelerle eşleşir
[abc] Karakter sınıfı [aeiou] herhangi bir sesli harfle eşleşir
[^abc] Negatif sınıf [^0-9] rakam olmayan karakterlerle eşleşir
\d Basamak (0-9) \d{3} üç basamakla eşleşir
\w Sözcük karakteri \w+ sözcük karakterleriyle eşleşir
{n} Tam olarak n defa \d{4} tam olarak dört basamakla eşleşir
{n,m} N ve m oluşumları arasında \d{2,4} 2 ila 4 basamak arasında eşleşir

Uyarı

SQL Server'ın normal ifade işlevleri ECMAScript standart regex söz dizimini kullanır. Bu, JavaScript ve diğer birçok programlama dilinde kullanılan söz dizimi ile aynıdır ve desenleri teknolojiler arasında taşınabilir hale getirir.

Desenleri eşleştirme REGEXP_LIKE

REGEXP_LIKE bir dize normal ifade deseni ile eşleşiyorsa 1 (true) veya eşleşmiyorsa 0 (yanlış) döndürür. Karmaşık desenlere göre satırları filtrelemek için yan tümcelerde WHERE bu işlevi kullanın:

-- 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;

Veri biçimlerini doğrulama:

-- 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;

flags parametresiyle büyük/küçük harfe duyarsız eşleştirmeyi kullanın:

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

Tavsiye

Doğrulama ve filtreleme için kullanın REGEXP_LIKE . Yalnızca bir desen olup olmadığını bilmeniz gerektiğinde alt dizeleri ayıklamaktan daha verimlidir.

Metni şununla değiştir: REGEXP_REPLACE

REGEXP_REPLACE bir desenin tüm oluşumlarını bulur ve bunları belirtilen bir dizeyle değiştirir. Bu işlev, veri temizleme ve standartlaştırma için kullanışlıdır:

-- 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;

Aşağıdaki örneklerde, geri başvurularla yakalama gruplarının nasıl kullanılacağı gösterilmektedir:

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

Aşağıdaki örneklerde verileri temizleme ve normalleştirme gösterilmektedir:

-- 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;

REGEXP_SUBSTR ile alt dizeleri ayıklama

REGEXP_SUBSTR bir dizenin normal ifade deseni ile eşleşen bölümünü ayıklar. Aşağıdaki örnekler gibi yapılandırılmamış metinden belirli veri öğelerini çekmek için bunu kullanın:

-- 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;

Aşağıdaki örnek, oluşum ve yakalama grupları için parametreleri içeren işlev imzasını gösterir:

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

ile desen konumlarını bulma REGEXP_INSTR

REGEXP_INSTR bir dize içindeki desen eşleşmesinin başlangıç konumunu döndürür. Aşağıdaki örnekler gibi eşleşme bulunamazsa 0 döndürür:

-- 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;

ile desen oluşumlarını sayma REGEXP_COUNT

REGEXP_COUNT bir desenin dizede kaç kez görüntülendiğinden döndürür. Aşağıdaki örneklerde kullanımı gösterilmektedir:

-- 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;

Dizeleri REGEXP_SPLIT_TO_TABLE ile böl

REGEXP_SPLIT_TO_TABLE , bir dizeyi bir sınırlayıcı desene göre satırlara bölen bir tablo değerli işlevdir.

-- 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, '[,;|]');

REGEXP_SPLIT_TO_TABLE öğesini CROSS APPLY kullanarak diğer sorgularla birleştirebilirsiniz.

-- 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;

Tüm eşleşmeleri REGEXP_MATCHES ile döndür

REGEXP_MATCHES , tüm desen eşleşmelerini ayrı satırlar olarak döndüren tablo değerli bir işlevdir:

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

Önemli

Normal ifade işlevleri SQL Server 2025'te ve Microsoft Fabric'teki SQL veritabanlarında kullanılabilir. Önceki SQL Server sürümleri için karmaşık regex işlemleri için CLR işlevlerini veya uygulama katmanı işlemeyi kullanmayı göz önünde bulundurun.

Normal ifade işlevleri hakkında daha fazla bilgi için bkz. Normal ifadeler.