2013-03-20 6 views
5

Sto tentando di creare una funzione in SQL Server 2005 per verificare se un messaggio di posta elettronica è in un formato valido con espressioni regolari.Funzione di verifica e-mail SQL utilizzando Regex

Ecco quello che ho finora:

CREATE FUNCTION isValidEmailFormat 
(
    @Email varchar(100) 
) 
RETURNS bit 
AS 
BEGIN 
    DECLARE @Result bit 

    SET @Result = (SELECT CASE 
        WHEN @Email LIKE '%[a-zA-Z0-9_\-][email protected]([a-zA-Z0-9_\-]+\.)+ (com|org|edu|nz|au])%' 
         THEN 1 
         ELSE 0 
        END AS Valid) 
    RETURN @Result 
END 

Sto facendo qualcosa di sbagliato con la mia espressione regolare? O devo fare qualcosa di più per confrontare un varchar con un'espressione regolare?

operativa -Editazione-

In questo momento, qualunque stringa ho messo in restituisce un 0, anche se il formato di posta elettronica in sé è corretta.

+0

Non penso che questo sia un tuo problema, ma c'è un extra ']' dopo 'au'. –

+0

@ acheong87 Questo non era il problema. Grazie, anche perché potrebbe aiutarmi in seguito quando trovo una soluzione. –

risposta

5

La risposta breve è che no, non può essere fatto. La sintassi per LIKE non è la stessa di (e molto meno potente di) le espressioni regolari. Vedi anche SQL Server Regular expressions in T-SQL

Ma si può fare il salto a .Net e fare l'abbinamento lì. È possibile creare un'istanza di VBScript.RegExp all'interno di T-SQL utilizzando sp_OACreate e utilizzarla.

CREATE FUNCTION dbo.isValidEmailFormat 
(
    @Email varchar(100) 
) 
RETURNS bit 
AS 
BEGIN 
    DECLARE @pattern varchar(4000) 
    SET @pattern = '[a-zA-Z0-9_\-][email protected]([a-zA-Z0-9_\-]+\.)+(com|org|edu|nz|au)' 
    DECLARE @Result bit 

    DECLARE @objRegexExp INT 
    EXEC sp_OACreate 'VBScript.RegExp', @objRegexExp OUT 

    EXEC sp_OASetProperty @objRegexExp, 'Pattern', @pattern 
    EXEC sp_OASetProperty @objRegexExp, 'IgnoreCase', 1 
    EXEC sp_OASetProperty @objRegexExp, 'MultiLine', 0 
    EXEC sp_OASetProperty @objRegexExp, 'Global', false 
    EXEC sp_OASetProperty @objRegexExp, 'CultureInvariant', true 

    EXEC sp_OAMethod @objRegexExp, 'Test', @Result OUT, @Email 

    EXEC sp_OADestroy @objRegexExp 

    RETURN @Result 
END 

fare dare uno sguardo a Regex email verification error - using JavaScript per vedere se si vuole essere un po 'meno restrittiva su ciò che i personaggi sono ammessi.

+0

Grazie @ Flup. Stavo cercando di evitare di scrivere un programma, ma credo che dovrò farlo. Ho un programma che usa questo, semplicemente non volevo confrontare i dati dei clienti in due posti diversi. –

+0

Non sono sicuro se lo chiamerei un programma. È possibile creare un'istanza dell'oggetto reisexp INSIDE SQL Server e richiamarne i metodi. Aggiungerò il codice alla mia risposta. – flup

+0

Grazie per l'aggiornamento! L'unico errore nel tuo codice è che hai bisogno di SET @pattern = '[a-zA-Z0-9 _ \ -] + @ ([a-zA-Z0-9 _ \ -] + \.) + (Com | org | edu | nz | au]) ' –

2

ho usato @flup 's risposta e aggiornato il modello RegExp come segue:

  • punti sono consentiti nella parte prima @, ma non come primo o ultimo carattere non
  • l'espressione è ancorato a inizio e fine della stringa con^e $
  • TLD specifiche e codici dei paesi sono stati aggiunti per i dati che usavo

I domini di primo livello sono whitelist esplicitamente di escludere molti errori di battitura in cui .c om è stato inserito come .co o .cm - codici paese validi per Colombia o Camerun ma non per i miei dati.

La linea aggiornata:

SET @pattern = '^([a-zA-Z0-9_\-]+\.)*[a-zA-Z0-9_\-][email protected]([a-zA-Z0-9_\-]+\.)+(com|org|edu|net|ca|au|coop|de|ee|es|fm|fr|gr|ie|in|it|jp|me|nl|nu|ru|uk|us|za)$' 

Spero che questo aggiunge valore ad una risposta già eccellente.

Problemi correlati