Porovnávání vzorů s regulárními výrazy

Dokončeno

Návod

Další podrobnosti najdete na kartě Text a obrázky .

Zpracování textu v databázích často vyžaduje porovnávání vzorů, které přesahuje možnosti operátoru LIKE. Regulární výrazy poskytují standardizovanou syntaxi pro komplexní porovnávání vzorů, ověřování a transformaci textu. Databáze SQL Serveru 2025 a SQL v Microsoft Fabric zahrnují podporu regulárních výrazů prostřednictvím nových funkcí T-SQL.

Zvažte případy, kdy LIKE nestačí: ověřit e-mailovou adresu se správným formátem, extrahovat telefonní čísla bez ohledu na rozdíly ve formátování, najít produktové kódy, které se řídí konkrétními konvencemi pojmenování, nebo rozpoznat vzory, jako jsou po sobě jdoucí opakované znaky. Operátor LIKE podporuje pouze jednoduché zástupné znaky (% pro všechny znaky, _ pro jeden znak), které nemohou vyjádřit tyto složité vzory.

Regulární výrazy řeší tato omezení poskytováním bohatého jazyka vzorů. U regulárních výrazů můžete porovnávat konkrétní rozsahy znaků, vyžadovat přesné počty opakování, použít alternaci (odpovídat tomuto NEBO tamtomu) a zachytit části odpovídajícího textu pro extrakci nebo nahrazení. Jakmile se naučíte syntaxi regulárních výrazů, můžete ji použít v mnoha programovacích jazycích a nástrojích – vzory, které píšete pro SQL Server, fungují podobně v Pythonu, JavaScriptu a nástrojích příkazového řádku.

Pochopení základů regulárních výrazů

Regulární výrazy (regex) používají syntaxi vzoru k popisu textových vzorů. Než se seznámíte s funkcemi SQL Serveru, pojďme se podívat na tyto běžné komponenty regulárních výrazů:

Vzor Description Příklad shody
. Libovolný jeden znak a.c odpovídá "abc", "a1c"
* Nula nebo více předchozích ab*c odpovídá "ac", "abc", "abbc"
+ Minimálně jeden z předchozích ab+c odpovídá "abc", "abbc" , ale ne "ac"
? Nula nebo jedna z předchozích colou?r odpovídá "color", "color"
^ Začátek řetězce ^Hello odpovídá řetězcům začínajícím na "Hello"
$ Konec řetězce world$ odpovídá řetězcům končícím na "world"
[abc] Třída postavy [aeiou] odpovídá libovolné samohlásce.
[^abc] Negovaná třída [^0-9] odpovídá nečíselným znakům
\d Číslice (0–9) \d{3} odpovídá třem číslicům.
\w Znak slova \w+ odpovídá znakům slova
{n} Přesně n výskytů \d{4} odpovídá přesně čtyřmístným číslicům.
{n,m} Mezi n a m výskyty \d{2,4} Odpovídá 2 až 4 číslicemi

Poznámka:

Funkce regulárních výrazů SQL Serveru používají standardní syntaxi regulárních výrazů ECMAScript . Tento skript je stejná syntaxe používaná v JavaScriptu a mnoha dalších programovacích jazycích, takže vzory jsou přenositelné napříč technologiemi.

Porovnávání vzorů s využitím REGEXP_LIKE

REGEXP_LIKE vrátí hodnotu 1 (true), pokud řetězec odpovídá vzoru regulárního výrazu nebo 0 (false), pokud ne. Pomocí této funkce v WHERE klauzulích můžete filtrovat řádky na základě složitých vzorů:

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

Ověření datových formátů:

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

Použijte porovnávání bez ohledu na velká a malá písmena s parametrem 'flags':

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

Návod

Slouží REGEXP_LIKE k ověřování a filtrování. Je efektivnější než extrakce podřetězců v případě, že potřebujete zjistit, jestli existuje vzor.

Nahrazení textu textem REGEXP_REPLACE

REGEXP_REPLACE najde všechny výskyty vzoru a nahradí je zadaným řetězcem. Tato funkce je užitečná pro čištění a standardizaci dat:

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

Následující příklady ukazují, jak používat skupiny zachycení s backreferencemi:

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

Následující příklady ukazují, jak vyčistit a normalizovat 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;

Extrahování podřetědců pomocí REGEXP_SUBSTR

REGEXP_SUBSTR extrahuje část řetězce, která odpovídá vzoru regulárního výrazu. Použijte ho k načtení konkrétních datových prvků z nestrukturovaného textu, například z následujících příkladů:

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

Následující příklad ukazuje podpis funkce, který obsahuje parametry pro skupiny výskytů a zachycení:

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

Vyhledání pozic vzorů s využitím REGEXP_INSTR

REGEXP_INSTR vrátí počáteční pozici shody vzorku v řetězci. Vrátí hodnotu 0, pokud se nenajde žádná shoda, například následující příklady:

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

Počet výskytů vzorů s využitím REGEXP_COUNT

REGEXP_COUNT vrátí počet výskytů vzoru v řetězci. Následující příklady ilustrují jeho použití:

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

Rozdělení řetězců pomocí REGEXP_SPLIT_TO_TABLE

REGEXP_SPLIT_TO_TABLE je funkce s hodnotou tabulky, která rozdělí řetězec na řádky na základě vzoru oddělovače:

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

S jinými dotazy můžete kombinovat REGEXP_SPLIT_TO_TABLE pomocí 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;

Vrácení všech shod s REGEXP_MATCHES

REGEXP_MATCHES je funkce s hodnotou tabulky, která vrací všechny vzorové shody jako samostatné řádky:

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

Důležité

Funkce regulárních výrazů jsou k dispozici v databázích SQL Serveru 2025 a SQL v Microsoft Fabric. U starších verzí SQL Server zvažte použití funkcí CLR (Common Language Runtime) nebo zpracování aplikační vrstvy pro složité operace regulárních výrazů.

Další informace o funkcích regulárních výrazů najdete v tématu Regulární výrazy.