Bemærk
Adgang til denne side kræver godkendelse. Du kan prøve at logge på eller ændre mapper.
Adgang til denne side kræver godkendelse. Du kan prøve at ændre mapper.
Gælder for:✅ SQL Analytics-slutpunkt og warehouse i Microsoft Fabric
Regulære udtryk (regex) funktioner lader dig matche komplekse tekstmønstre og manipulere strengdata direkte i dine T-SQL-forespørgsler. Brug dem til at validere formater, udtrække værdier fra semistruktureret tekst, tælle mønsterforekomster og rense eller maskere data uden at flytte dem ud af lageret.
Note
Regulære udtryk er i øjeblikket i forhåndsvisning.
Warehouse og SQL-analyse-endpointet understøtter de skalare regulære udtryksfunktioner. Hver af disse funktioner returnerer én værdi pr. inputrække, så du kan bruge dem i SELECT listen, WHERE, JOIN, GROUP BY, ORDER BY, og CASE udtryk.
Note
Kun skalare regulære udtryksfunktioner er tilgængelige i Warehouse. De tabelværdiede funktioner REGEXP_MATCHES og REGEXP_SPLIT_TO_TABLE understøttes ikke.
Understøttede funktioner
| Funktion | Returntype | Beskrivende tekst |
|---|---|---|
| REGEXP_LIKE | Boolean | Angiver om tekstinputtet matcher regex-mønsteret. Brug det som et prædikat, for eksempel i en WHERE sætning eller et CASE udtryk. |
| REGEXP_REPLACE | Strengudtryk | Returnerer kildestrengen med forekomster af regex-mønsteret erstattet af en erstatningsstreng. Hvis der ikke findes match, returnerer den oprindelige streng. |
| REGEXP_SUBSTR | Strengudtryk | Returnerer den n-teforekomst af en delstreng, der matcher regex-mønsteret. |
| REGEXP_INSTR | int |
Returnerer start- eller slutpositionen for den matchede delstreng. |
| REGEXP_COUNT | int |
Returnerer antallet af gange, regex-mønsteret forekommer i en streng. |
Syntaks
REGEXP_LIKE ( string_expression, pattern_expression [ , flags ] )
REGEXP_REPLACE ( string_expression, pattern_expression [ , string_replacement [ , start [ , occurrence [ , flags ] ] ] ] )
REGEXP_SUBSTR ( string_expression, pattern_expression [ , start [ , occurrence [ , flags [ , group ] ] ] ] )
REGEXP_INSTR ( string_expression, pattern_expression [ , start [ , occurrence [ , return_option [ , flags [ , group ] ] ] ] ] )
REGEXP_COUNT ( string_expression, pattern_expression [ , start [ , flags ] ] )
For en fuld beskrivelse af hvert argument, se referencen til den linkede funktion i Understøttede funktioner.
Flag
Det valgfrie flags argument er en char eller værdi varchar på op til 30 tegn, der sætter matchende modifikatorer. Hvis du giver modstridende flag, vinder det sidste. For eksempel 'ic' resulterer i småbogstavsfølsom matchning.
| Flag | Beskrivende tekst |
|---|---|
c |
Tilpasning med små og små bogstaver. Dette er standarden. |
i |
Matching uden store og små bogstader. |
m |
Multilinje-tilstand: ^ og $ match begyndelsen og slutningen af hver linje samt begyndelsen og slutningen af teksten. |
s |
Lad os . matche linjeskiftet .\n |
Overvejelser
- Argumentet
string_expressionaccepterer tegnstrengstyper. Store værdier (varchar(max)) understøttes op til 2 MB. - Argumentet
pattern_expressionunderstøtter en maksimal længde på 8.000 bytes. - Regulære udtryksfunktioner respekterer ikke kollationsreglerne. Matching kan adskille sig fra andre strengsammenligninger, såsom
LIKE. For at kontrollere kasusfølsomhed skal du brugeiog-flageneci stedet for at stole på kolonne-kollationen. For mere information, se data warehouse collation. -
REGEXP_LIKEreturnerer en boolesk værdi og kan ikke returneres direkte som en kolonne. For at returnere resultatet som en kolonne, indpakk det i etCASEudtryk.
Eksempler
Følgende eksempler bruger et lille inline datasæt, så du kan køre dem i ethvert lager eller SQL-analyse-endpoint.
A. Filtrer rækker, der matcher et mønster
Brug REGEXP_LIKE i en WHERE klausul til kun at returnere rækker med gyldigt e-mailadresseformat.
SELECT CustomerId, Email
FROM (VALUES
(1, 'anna@contoso.com'),
(2, 'not-an-email'),
(3, 'Bob.Smith@Fabrikam.org')
) AS c (CustomerId, Email)
WHERE REGEXP_LIKE(Email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$');
For at returnere matchresultatet som en kolonne, indpakk REGEXP_LIKE et CASE udtryk:
SELECT Email,
CASE WHEN REGEXP_LIKE(Email, '@contoso\.com$', 'i') THEN 'Internal' ELSE 'External' END AS EmailType
FROM (VALUES ('anna@CONTOSO.com'), ('bob@fabrikam.org')) AS c (Email);
B. Udtræk en værdi fra tekst
Brug REGEXP_SUBSTR til at udtrække det første ordrenummer i formatet ORD- efterfulgt af cifre fra en fritekstkommentar.
SELECT Comment,
REGEXP_SUBSTR(Comment, 'ORD-\d+') AS OrderNumber
FROM (VALUES
('Customer called about ORD-10293 and ORD-10311.'),
('No order referenced.')
) AS t (Comment);
For kun at udtrække en del af kampen, brug en fangstgruppe. Følgende forespørgsel returnerer domænet for hver e-mailadresse:
SELECT REGEXP_SUBSTR(Email, '@(.+)$', 1, 1, 'c', 1) AS EmailDomain
FROM (VALUES ('anna@contoso.com'), ('bob@fabrikam.org')) AS c (Email);
C. Forekomster af tællemønstre
Brug REGEXP_COUNT den til at tælle, hvor mange tal der optræder i hver streng.
SELECT Comment,
REGEXP_COUNT(Comment, '\d+') AS NumberCount
FROM (VALUES
('Shipped 3 boxes on 12 May, invoice 4471.'),
('No numbers here.')
) AS t (Comment);
D. Find placeringen af en match
Brug REGEXP_INSTR den til at finde startpositionen og slutpositionen for den første sekvens af cifre.
SELECT ProductCode,
REGEXP_INSTR(ProductCode, '\d+') AS FirstDigitStart,
REGEXP_INSTR(ProductCode, '\d+', 1, 1, 1) AS FirstDigitEnd
FROM (VALUES ('BK-R93R-62'), ('HL-U509')) AS p (ProductCode);
E. Rens og masker data
Brug REGEXP_REPLACE til at standardisere telefonnumre med capture-grupper og til at maskere alle undtagen de sidste fire cifre.
SELECT Phone,
REGEXP_REPLACE(Phone, '^(\d{3})-(\d{3})-(\d{4})$', '(\1) \2-\3') AS FormattedPhone,
REGEXP_REPLACE(Phone, '^\d{3}-\d{3}', '***-***') AS MaskedPhone
FROM (VALUES ('425-555-0187'), ('206-555-0142')) AS c (Phone);
Følgende forespørgsel samler gentaget hvidrum til ét enkelt mellemrum:
SELECT REGEXP_REPLACE('Fabric Data Warehouse', '\s+', ' ') AS CleanText;
F. Gruppere og aggregere med en udtrukket værdi
Fordi funktionerne er skalar, kan du bruge dem i GROUP BY klausuler. Følgende forespørgsel tæller kunder pr. e-maildomæne.
SELECT LOWER(REGEXP_SUBSTR(Email, '@(.+)$', 1, 1, 'c', 1)) AS EmailDomain,
COUNT(*) AS Customers
FROM (VALUES
('anna@contoso.com'),
('bob@Contoso.com'),
('chris@fabrikam.org')
) AS c (Email)
GROUP BY LOWER(REGEXP_SUBSTR(Email, '@(.+)$', 1, 1, 'c', 1));