Match mønstre med regulære uttrykk
Tekstbehandling i databaser krever ofte mønstergjengivelse som går utover det operatøren LIKE kan håndtere. Regulære uttrykk gir en standardisert syntaks for kompleks mønstergjenfinning, validering og teksttransformasjon. SQL Server 2025 og SQL-databaser i Microsoft Fabric inkluderer støtte for regulære uttrykk gjennom nye T-SQL-funksjoner.
Vurder scenarioer hvor LIKE det ikke lykkes: validering av e-postadresser med riktig format, henting av telefonnumre uavhengig av formatvariasjoner, funn produktkoder som følger spesifikke navnekonvensjoner, eller oppdage mønstre som påfølgende gjentatte tegn. Operatøren LIKE støtter kun enkle jokerkort (% for alle tegn, _ for ett enkelt tegn), som ikke kan uttrykke disse komplekse mønstrene.
Regulære uttrykk løser disse begrensningene ved å tilby et rikt mønsterspråk. Med regex kan du matche spesifikke tegnområder, kreve nøyaktige repetisjonstall, bruke alternering (matche dette ELLER det), og fange deler av matchet tekst for utdrag eller erstatning. Når du har lært regex-syntaks, kan du bruke det på mange programmeringsspråk og verktøy – mønstrene du skriver for SQL Server fungerer på lignende måte i Python, JavaScript og kommandolinjeverktøy.
Forstå grunnleggende regulære uttrykk
Regulære uttrykk (regex) bruker en mønstersyntaks for å beskrive tekstmønstre. Før du lærer deg SQL Servers funksjoner, la oss se på disse vanlige regex-komponentene:
| Mønster | Beskrivelse | Eksempelkamp |
|---|---|---|
. |
Enhver enkelt karakter |
a.c Matcher "ABC","A1C" |
* |
Null eller flere av de foregående |
ab*cMatcher "AC","ABC","ABC" |
+ |
En eller flere av de foregående |
ab+c Matcher "ABC","ABBC" men ikke "AC" |
? |
Null eller en av de foregående |
colou?r matcher "color","colour" |
^ |
Begynnelsen av strengen |
^Hello matcher strenger som starter med "Hello" |
$ |
Enden av strengen |
world$ Matcher strenger som ender med "world" |
[abc] |
Karakter klasse |
[aeiou] matcher hvilken som helst vokal |
[^abc] |
Negert klasse |
[^0-9] Matcher ikke-sifrede |
\d |
Siffer (0-9) |
\d{3} matcher tre sifre |
\w |
Ordtegn |
\w+ Matcher ordtegn |
{n} |
Nøyaktig n forekomster |
\d{4} matcher nøyaktig fire sifre |
{n,m} |
Mellom n og m forekomster |
\d{2,4} matcher 2 til 4 sifre |
Bemerkning
SQL Servers regulære uttrykksfunksjoner bruker ECMAScript-standard regex-syntaks. Dette er den samme syntaksen som brukes i JavaScript og mange andre programmeringsspråk, noe som gjør mønstre portable på tvers av teknologier.
Match mønstre med REGEXP_LIKE
REGEXP_LIKE returnerer 1 (sann) hvis en streng samsvarer med et mønster for regulære uttrykk, eller 0 (falsk) hvis den ikke gjør det. Bruk denne funksjonen i WHERE klausuler for å filtrere rader basert på komplekse mønstre:
-- 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;
Valider dataformater:
-- 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;
Bruk kasus-insensitiv matching med flaggparameteren:
-- 'i' flag enables case-insensitive matching
SELECT Name
FROM SalesLT.Product
WHERE REGEXP_LIKE(Name, 'frame', 'i') = 1;
Tips
Bruk REGEXP_LIKE det til validering og filtrering. Det er mer effektivt enn å hente ut delstrenger når du bare trenger å vite om et mønster eksisterer.
Erstatt tekst med REGEXP_REPLACE
REGEXP_REPLACE finner alle forekomster av et mønster og erstatter dem med en spesifisert streng. Denne funksjonen er nyttig for datarensing og standardisering:
-- 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;
Følgende eksempler demonstrerer hvordan man bruker capture groups med tilbakereferanser:
-- 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
Følgende eksempler demonstrerer hvordan man kan rense og normalisere 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;
Trekk ut delstrenger med REGEXP_SUBSTR
REGEXP_SUBSTR trekker ut den delen av en streng som matcher et regulært uttrykksmønster. Bruk den til å hente spesifikke dataelementer fra ustrukturert tekst, som i følgende eksempler:
-- 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;
Følgende eksempel demonstrerer funksjonssignaturen, som inkluderer parametere for forekomst- og fangstgrupper:
REGEXP_SUBSTR(source, pattern, start_position, occurrence, flags, capture_group)
Finn mønsterposisjoner med REGEXP_INSTR
REGEXP_INSTR returnerer startposisjonen til en mønstermatch innenfor en streng. Returnerer 0 hvis ingen match finnes, som i følgende eksempler:
-- 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;
Tellemønsterforekomster med REGEXP_COUNT
REGEXP_COUNT returnerer antall ganger et mønster forekommer i en streng. Følgende eksempler illustrerer bruken:
-- 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;
Split strenger med REGEXP_SPLIT_TO_TABLE
REGEXP_SPLIT_TO_TABLE er en tabellverdifunksjon som deler en streng i rader basert på et avgrensemønster:
-- 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, '[,;|]');
Du kan kombinere med andre spørringer ved å bruke REGEXP_SPLIT_TO_TABLECROSS 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;
Returner alle kamper med REGEXP_MATCHES
REGEXP_MATCHES er en tabellverd funksjon som returnerer alle mønstertreff som separate rader:
-- 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
Viktig!
Regulære uttrykksfunksjoner er tilgjengelige i SQL Server 2025 og SQL-databaser i Microsoft Fabric. For tidligere SQL Server-versjoner bør du vurdere å bruke CLR-funksjoner eller applikasjonslagsbehandling for komplekse regex-operasjoner.
For mer informasjon om regulære uttrykksfunksjoner, se Regulære uttrykk.