2015-05-14 10 views
5

Próbuję zrobić mecz regex, który całkowicie odrzuca dogadania.Regex uprzedzający odrzucił mecz

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

To jest mecz i to jest mój regex101 test.

Ale kiedy wiadomość e-mail zaczyna się od - lub _ lub ., nie powinna się całkowicie zgadzać, a nie tylko usunąć początkowe symbole. Wszelkie pomysły są mile widziane, szukałem przez ostatnie pół godziny, ale nie wiem, jak usunąć cały e-mail, gdy zaczyna się od tych symboli.

Odpowiedz

2

Można użyć granicę słowa niedaleko @ z ujemnym lookbehind aby sprawdzić, czy jesteśmy na początku łańcucha lub tuż po spacji, a następnie sprawdzić, czy 1st symbol nie jest wewnątrz niechcianego klasy [^\s\-_.]:

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

Zobacz demo

Lista meczów:

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

Dodatkowe uwagi dotyczące użytkowania i alternatywnych notacji

pamiętać, że najlepiej jest używać jako mało uciekł znaki, jak to możliwe w regex, tak, to [^\s\-_.] można zapisać jako [^\s_.-], z łącznikiem na końcu znaku klasa wciąż oznaczająca literalny łącznik, a nie zakres. Ponadto, jeśli planujesz użyć wzorca w innych silnikach regex, możesz napotkać na trudności związane z naprzemiennym wyglądem, a następnie zastąpić (?<=\s|^) odpowiednikiem (?<!\S). Zobacz this regex:

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

i last but not least, jeśli chcesz go używać w JavaScript lub innych językach nie wspierających lookarounds wymienić (?<!\S)/(?<=\s|^) z (nie) grupę (\s|^) przechwytywania, zawinąć całego wzoru email część z innego zestawu przechwytywania nawiasów i używać języka znaczy chwycić Grupa 1 zawartość:

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

Zobacz regex demo.

+0

Inteligentny Korzystanie z '\ B' tam;) Gdzie jest –

0

Używam tego dla wielu adresów e-mail, oddzielna znakiem ';':

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

Dla pojedynczej mail:

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

twoje rozwiązanie dla 'Ale kiedy e-mail zaczyna się od - lub _ lub. to nie powinno całkowicie pasować do tego "? – nhahtdh

Powiązane problemy