2015-12-18 13 views
5

sto cercando di convertire C# e-mail le espressioni regolari, che ho preso dalle MSDN sampleRegex - bersaglio non valido per quantificatore che la conversione di C# Regex a JavaScript Regex

@"^(?("")("".+?(?<!\\)""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@)) (?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9]))$" 

che è come questo:

^(?(")(".+?"@)|(([0-9a-zA-Z]((\.(?!\.))|[^!#\$%&\s'\*/=\?\^`\{\}\|~])*)(?<=[-+0-9a-zA-Z_])@))(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]*\.)+[a-zA-Z]{2,6}))$ 

ma sto ricevendo errore per:

?: target non valido per il qualificatore.

? < =: lookbehind non è supportato in JavaScript

ho bisogno di aiuto nella conversione di sopra Regex

+0

Stai convalidando troppo. Usa un'espressione più semplice. Dopo tutto, l'unico modo per sapere se un indirizzo e-mail è veramente valido è quello di inviare effettivamente un messaggio. – PhonicUK

+0

È stato utilizzato con il flag IgnorePatternWhitespace? –

+0

Il mio suggerimento: cercare una regex simile scritta in JavaScript. Vi è un gran numero di siti con espressioni regolari per e-mail su Internet. –

risposta

2

In .NET, questa espressione regolare deve essere stato utilizzato con IgnorePatternWhitespace e IgnoreCase bandiere poiché non v'è uno spazio che impedisce di corrispondenza. Ecco uno demo.

I problemi che si verificano durante il porting della regex su JS sono causati dal fatto che JS regex non supporta lookbehind e condizionali.

C'è una soluzione condizionale per JS: .NET (?(")"[^"]*"|\w+) può essere tradotto come (?:(?=")"[^"]*"|(?!")\w+).

I parapetti sono difficili da convertire, ma qui, la prima occhiata dietro non sembra appropriata. Stai cercando di trovare la serie più vicina di virgolette doppie senza escape. Puoi farlo con "[^"\\]*(?:\\.[^"\\]*)*".

La seconda schermata mostra solo se @ è preceduto da un carattere di lettera o cifra. Il modo più semplice per gestirlo è aggiungere la classe di caratteri [a-z0-9] alla sinistra del simbolo @ e applicare un quantificatore ? al primo gruppo di questa alternativa, facendo apparire una cifra o una lettera prima dello @ e la parte utente di 1 carattere resterebbe essere abbinati

Quindi, è possibile utilizzare

/^(?:(?=")("[^"\\]*(?:\\.[^"\\]*)*"@)|(?!")(([0-9a-z]((\.(?!\.))|[-!#$%&'*+\/=?^`{}|~\w])*)?[a-z0-9]@))(?:(?=\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(?!\[)(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9][-a-z0-9]{0,22}[a-z0-9]))$/i 

Vedi demo (nota ho anche rimosso alcuni simboli di fuga non necessari).

+0

In generale, questo '(?: \ B | [^ _])' è problematico. '[^ _]' Non corrisponde solo a underscore, forza più di 1 carattere prima del simbolo @ se non a un limite di parola.Inoltre, '(? = \ [)' E '(?! \ [)' non sono necessari poiché non potrebbero mai essere abbinati nel cluster di alternanza. – sln

+0

D'accordo, era un po 'problematico. Dal momento che la regex originale non consente '_ @ gmail.com', suppongo che OP possa usare tranquillamente' \ b' piuttosto che '[^ \ W_]'. Se la parte utente può avere almeno 2 simboli, '[^ \ W_]' potrebbe essere usato, tutto dipende dai requisiti. Per quanto riguarda i lookahead, sono necessari per emulare un costrutto condizionale. –

+0

La parola boundary '\ b' da sola non funzionerà perché corrisponde a' ciao_ @ world.com' ma si aspetta '[a-z0-9] @'. E il lookahead è su '[' funziona, ma non è necessario perché è un tipico '^ (?: \ [+ | [^ \ [] +) $ 'situazione, dove non c'è' ['corrispondente alla parte destra dell'alternanza. In effetti, entrambi i condizionali erano superfini per cominciare. – sln