Usare funzioni di espressione regolare in Fabric Data Warehouse

Si applica a:✅ endpoint di analisi SQL e magazzino dati in Microsoft Fabric

Le funzioni di espressione regolare (regex) ti permettono di abbinare pattern di testo complessi e manipolare direttamente i dati delle stringhe nelle tue query T-SQL. Usali per validare i formati, estrarre valori da testi semi-strutturati, contare le occorrenze dei pattern e pulire o mascherare i dati senza spostarli fuori dal warehouse.

Note

Le espressioni regolari sono attualmente in anteprima.

Warehouse e l'endpoint di analisi SQL supportano le funzioni scalari di espressioni regolari. Ognuna di queste funzioni restituisce un valore per ogni riga di input, quindi puoi usarle nell'elenco SELECT, WHERE, JOIN, GROUP BY, ORDER BY e nelle espressioni CASE.

Note

Solo funzioni scalari di espressione regolare sono disponibili in Warehouse. Le funzioni a valori di tabella REGEXP_MATCHES e REGEXP_SPLIT_TO_TABLE non sono supportate.

Funzioni supportate

Function Tipo di ritorno Description
REGEXP_LIKE Booleano Indica se l'input di testo corrisponde al pattern regex. Usalo come predicato, ad esempio in una WHERE proposizione o in una CASE espressione.
REGEXP_REPLACE Espressione stringa Restituisce la stringa sorgente con le occorrenze del pattern regex sostituite da una stringa sostitutiva. Se non si trovano corrispondenze, restituisce la stringa originale.
REGEXP_SUBSTR Espressione stringa Restituisce l'n-esima occorrenza di una sottostringa che corrisponde al pattern regex.
REGEXP_INSTR int Restituisce la posizione iniziale o finale della sottostringa abbinata.
REGEXP_COUNT int Restituisce il numero di volte in cui il pattern regex si verifica in una stringa.

Syntax

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

Per una descrizione completa di ogni argomento, vedi il riferimento alla funzione collegata in Funzioni supportate.

Flags

L'argomento opzionale flags è un valore char o varchar di massimo 30 caratteri che imposta i modificatori corrispondenti. Se fornisci flag contraddittori, prevale l'ultimo. Ad esempio, 'ic' si traduce in una corrispondenza con distinzione tra maiuscole e minuscole.

Flag Description
c Corrispondenza con distinzione tra maiuscole e minuscole. Si tratta dell'impostazione predefinita.
i Corrispondenza senza distinzione tra maiuscole e minuscole.
m Modalità multi-riga: ^ e $ corrispondono all'inizio e alla fine di ogni riga, oltre che all'inizio e alla fine del testo.
s Abbina . il carattere \ndi nuova riga.

Considerazioni

  • L'argomento string_expression accetta tipi di stringhe di caratteri. Valori grandi (varchar(max)) sono supportati fino a 2 MB.
  • L'argomento pattern_expression supporta una lunghezza massima di 8.000 byte.
  • Le funzioni di espressione regolare non rispettano le regole di collazione. L'abbinamento può differire da altri confronti di stringhe, come LIKE. Per controllare la distinzione tra maiuscole e minuscole, usa i flag i e c invece di affidarti alle regole di confronto della colonna. Per altre informazioni, vedere regole di confronto del Data Warehouse.
  • REGEXP_LIKE restituisce un valore booleano e non può essere restituito direttamente come colonna. Per restituire il risultato come colonna, si avvolge in un'espressione CASE .

Examples

I seguenti esempi utilizzano un piccolo set di dati inline, quindi puoi eseguirli in qualsiasi warehouse o endpoint SQL analytics.

A. Filtra le righe che corrispondono a un pattern

Usa REGEXP_LIKE in una clausola WHERE per restituire solo le righe con un indirizzo email valido.

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,}$');

Per restituire il risultato della corrispondenza come colonna, racchiudi REGEXP_LIKE in un'espressione CASE:

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. Estrai un valore dal testo

Usare REGEXP_SUBSTR per estrarre il primo numero d'ordine nel formato ORD- seguito da cifre in un commento in testo libero.

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

Per estrarre solo una parte della corrispondenza, usa un gruppo di cattura. La seguente query restituisce il dominio di ciascun indirizzo email:

SELECT REGEXP_SUBSTR(Email, '@(.+)$', 1, 1, 'c', 1) AS EmailDomain
FROM (VALUES ('anna@contoso.com'), ('bob@fabrikam.org')) AS c (Email);

C. Conta le occorrenze del pattern

Usa REGEXP_COUNT per contare quanti numeri compaiono in ogni stringa.

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. Trova la posizione di una corrispondenza

Usare REGEXP_INSTR per trovare la posizione iniziale e la posizione finale della prima sequenza di 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. Pulisci e maschera i dati

Usa REGEXP_REPLACE per standardizzare i numeri di telefono con i gruppi di cattura e per mascherare tutte le cifre tranne le ultime quattro.

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

La seguente query comprime gli spazi bianchi ripetuti in un unico spazio:

SELECT REGEXP_REPLACE('Fabric    Data   Warehouse', '\s+', ' ') AS CleanText;

F. Raggruppare e aggregare per un valore estratto

Poiché le funzioni sono scalari, puoi usarle nelle GROUP BY clausole. La seguente query conta i clienti per ogni dominio email.

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