Вы включили @
в качестве необязательного, поэтому совпадение пытается получить самое длинное имя пользователя.Поскольку вы не указали ограничение имени пользователя, в нем нельзя указывать @
s, оно соответствует самой длинной строке.
Просто используйте:
[^@]*
в качестве соответствующегоsubexpr для имен пользователей (и используйте $0
для получения совпавшей строки)
Или вы можете использовать этот , который можно использовать для поиска нескольких совпадений (и для получения как пользовательской части, так ичасть домена):
\b([^@\s]*)(@[^@\s]*)?\b
\b
заставляет вашу строку привязываться к границам слова, тогда первая группа соответствует непробельным и не @
символам (любое число, лучше использовать+
вместо *
там, поскольку имена пользователей должны иметь как минимум один символ), за которым (необязательно) следует @
и еще одна строка не пробелов и не @
символов).В этом случае $0
соответствует всем адресам электронной почты, $1
соответствует части имени пользователя и $2
части @domain
(вы можете уточнить только часть домена, добавив новую пару скобок, как в
b([^@\s]*)(@([^@\s]*))?\b
См. демо .