2015-05-14 13 views
5

Sto provando a fare una corrispondenza regolare che sta scartando completamente il lookahead.Guardare in vista Regex scartare una partita

\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 

Questa è la corrispondenza e questo è il mio regex101 test.

Ma quando una e-mail inizia con - o _ o . non dovrebbe corrispondere completamente, non solo rimuovere i simboli iniziali. Tutte le idee sono benvenute, ho cercato la mezz'ora precedente, ma non riesco a capire come eliminare l'intera e-mail quando inizia con quei simboli.

risposta

2

È possibile utilizzare il limite di parola nei pressi @ con un lookbehind negativo per verificare se siamo all'inizio di una stringa o subito dopo uno spazio bianco, quindi verificare se il 1 ° simbolo non è all'interno della classe indesiderato [^\s\-_.]:

(?<=^|\s)[^\s\-_.]\w*(?:[-+.]\w+)*\[email protected]\w+(?:[-.]\w+)*\.\w+(?:[-.]\w+)* 

Vedi demo

Lista di partite:

[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 

Note aggiuntive sul loro utilizzo e la notazione alternativa

Si noti che è delle migliori pratiche da usare come pochi sfuggiti caratteri possibile nel regex, quindi, il [^\s\-_.] può essere scritta come [^\s_.-], con il trattino alla fine del carattere classe che denota ancora un trattino letterale, non un intervallo. Inoltre, se prevedi di utilizzare il pattern in altri motori regex, potresti trovare difficoltà con l'alternanza nel lookbehind e quindi puoi sostituire (?<=\s|^) con l'equivalente (?<!\S). Vedere this regex:

(?<!\S)[^\s_.-]\w*(?:[-+.]\w+)*\[email protected]\w+(?:[-.]\w+)*\.\w+(?:[-.]\w+)* 

E, ultimo ma non meno importante, se avete bisogno di utilizzare in JavaScript o altri linguaggi che non supportano lookarounds, sostituire il (?<!\S)/(?<=\s|^) con un (non) gruppo di cattura di (\s|^), avvolgere l'intero modello e-mail parte con un altro set di parentesi catturare e utilizzare la lingua significa per afferrare Gruppo 1 contenuti:

(\s|^)([^\s_.-]\w*(?:[-+.]\w+)*\[email protected]\w+(?:[-.]\w+)*\.\w+(?:[-.]\w+)*) 

Vedere le regex demo.

+0

uso intelligente del \ b' 'là;) –

0

Io lo uso per più indirizzi email, separato con ';':

([A-Za-z0-9._%-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,4};)* 

Per una singola mail:

[A-Za-z0-9._%-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,4} 
+0

Dove si trova la tua soluzione per 'Ma quando una email inizia con - o _ o. non dovrebbe combaciare completamente? – nhahtdh

Problemi correlati