0 / 0 / 0
Регистрация: 01.08.2015
Сообщений: 104
1

Регулярное выражение для имени почтового ящика

28.08.2018, 17:39. Показов 2152. Ответов 13
Метки нет (Все метки)

Привет. Задача такая: есть строчка с перечислением различных почтовых ящиков (kavaganga@mail.ru, alexPupkin@gmail.com,
nastya2018@google.com, karas@mail.ru). Необходимо вывести все имена почтовых ящиков для перечисленных доменов. Пример вывода:
mail.ru > kavabanga, karas
gmail.com > alexPupkin
google.com > nastya2018

Собственно, вопрос в том, как мне посчитать и вывести имена почтовых ящиков для доменов? У меня как вариант сразу возникла идея запихнуть в массив эти адреса, по регулярке вытащить домены и в цикле сравнивать не на эквивалентность, а на содержимое элемента массива, т.е. каждой строки и результата поиска по регулярному выражению. Прикол в том, что находит все верно, но это не то. Подскажите, что тут можно сделать.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.08.2018, 17:39
Ответы с готовыми решениями:

Регулярное выражение для валидации почтового адреса
Решил закрыть пробел в знаниях по регуляркам. Пошарился по регистраторам почтовых ящиков разных...

Регулярное выражение для парсинга ответа почтового сервера
Здравствуйте, уважаемые коллеги! Необходимо содействие в создании регулярки для разбора текста...

Как узнать pop\imap адрес почтового сервера, для почтового ящика через whois
Добрый вечер. Есть нетривиальная задача: Как узнать pop\imap адрес почтового сервера, для...

Регулярное выражение для обрезки имени
Доброго времени суток. Не подскажете регулярное выражение для обрезки имени. пример :...

13
2882 / 2294 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
28.08.2018, 18:00 2
Цитата Сообщение от Kirillgo Посмотреть сообщение
находит все верно, но это не то
да ну?

Цитата Сообщение от Kirillgo Посмотреть сообщение
Подскажите, что тут можно сделать.
ну как минимум тут можно показать свой код
а потом желательно определиться самому что значит "не то" и как должно выглядеть "то"
0
Автоматизируй это!
Эксперт Python
6698 / 4260 / 1156
Регистрация: 30.03.2015
Сообщений: 12,515
Записей в блоге: 29
28.08.2018, 18:23 3
Цитата Сообщение от Kirillgo Посмотреть сообщение
находит все верно, но это не то
это как?

Java
1
2
3
4
List<String> emails = Arrays.asList("first@mail.ru", "second@mail.ru", "third@yandex.ru", "fourth@yandex.ru", "sixth@gmail.ru");
        emails.stream().
                collect(Collectors.groupingBy(a->a.split("@")[1], Collectors.mapping(e->e.split("@")[0], Collectors.toList()))).
                forEach((a,b)-> System.out.println(a+"="+b));
0
0 / 0 / 0
Регистрация: 01.08.2015
Сообщений: 104
28.08.2018, 18:44  [ТС] 4
Ок, код показываю, но там другие названия почтовых ящиков (это абсолютно не важно):
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
StringBuilder result = new StringBuilder();
        StringBuilder output = new StringBuilder("mail.ru ==> ");
        StringBuilder output1 = new StringBuilder("google.com ==> ");
        StringBuilder fin = new StringBuilder();
 
        String regex = ";(\\w+@\\w+\\.\\w{2,3});?";
        Matcher m = Pattern.compile(regex).matcher(input);
        while (m.find()) {
            result.append(m.group(1)).append(";");
        }
 
        Matcher m1 = Pattern.compile(";?(\\w+)@(\\w+\\.\\w{2,3})").matcher(result.toString());
        while (m1.find()) {
                if (m1.group(2).equals("mail.ru")) {
                    output.append(m1.group(1)).append(",");
                } else if (m1.group(2).equals("google.com")) {
                    output1.append(m1.group(1)).append(",");
                }
        }
        
        fin = output.append(output.toString()).append("\n").append(output1.toString());
 
        return fin.toString();
Крч, вывод такой:
Java
1
2
mail.ru ==> ivanov,bush,mail.ru ==> ivanov,bush,
google.com ==> petrov,obama,
А должен быть таким:
Java
1
2
mail.ru == > ivanov, bush
google.com ==> petrov, obama
Добавлено через 56 секунд
Лучше я пока что не придумал. Пример с лямбдами я не могу использовать, потому что пока не разбирался в них, хочу только через регулярные выражения выполнить.

Добавлено через 2 минуты
В input у меня строка вида: ivanov;Ivan Ivanov;ivanov@mail.ru
петров;Петр Петров;petrov@google.com
obama;Barack Obama;obama@google.com
bush;Джордж Буш;bush@mail.ru

Строка слитная, без переводов на новую (написал так для удобочитаемости).

Добавлено через 32 секунды
Мне решение готовое не нужно, а только подсказка как лучше сделать.
0
Автоматизируй это!
Эксперт Python
6698 / 4260 / 1156
Регистрация: 30.03.2015
Сообщений: 12,515
Записей в блоге: 29
28.08.2018, 18:47 5
Kirillgo, да блин создай мапу <стринг, лист>, перебирай список ящиков в цикле и закидывай их в мапу, ключ -это домен (мейлсру и т.п).
0
Эксперт Java
3638 / 2970 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
28.08.2018, 19:04 6
Цитата Сообщение от Kirillgo Посмотреть сообщение
хочу только через регулярные выражения выполнить.
groupby регулярками - это сильно так
1
0 / 0 / 0
Регистрация: 01.08.2015
Сообщений: 104
28.08.2018, 20:55  [ТС] 7
Не понял)

Добавлено через 27 минут
Попытался вот так сделать. Что скажете? Можно получше реализовать? Только не обзывайтесь!
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Map<String, List> map = new LinkedHashMap<>();
        List<String> list = new ArrayList<>();
        List<String> list1 = new ArrayList<>();
 
        String emailRegex = ";?(\\w+)@(\\w+\\.\\w+{2,3});?";
        Matcher mEmail = Pattern.compile(emailRegex).matcher(input);
        while (mEmail.find()) {
            if (mEmail.group(2).equals("mail.ru")) {
                list.add(mEmail.group(1));
            } else {
                list1.add(mEmail.group(1));
            }
            
        }
        map.put("mail.ru", list);
        map.put("google.com", list1);
        
        for (Map.Entry<String, List> entry: map.entrySet()) {
            System.out.println(entry.getKey() + " == > " + entry.getValue());
        }
Результат:

Java
1
2
mail.ru == > [ivanov, bush]
google.com == > [petrov, obama]
Немного вывод подкорректировать и все.
0
Автоматизируй это!
Эксперт Python
6698 / 4260 / 1156
Регистрация: 30.03.2015
Сообщений: 12,515
Записей в блоге: 29
29.08.2018, 08:16 8
Цитата Сообщение от Kirillgo Посмотреть сообщение
new LinkedHashMap<>();
зачем? тебе же порядок не важен, используй хешмап

Цитата Сообщение от Kirillgo Посмотреть сообщение
String emailRegex = ";?(\\w+)@(\\w+\\.\\w+{2,3});?";
* * * * Matcher mEmail = Pattern.compile(emailRegex).matcher(input);
* * * * while (mEmail.find()) {
* * * * * * if (mEmail.group(2).equals("mail.ru")) {
* * * * * * * * list.add(mEmail.group(1));
* * * * * * } else {
* * * * * * * * list1.add(mEmail.group(1));
* * * * * * }
}
зачем? просто спрашиваешь у мапы - а есть ли тебя такой ключ (мейлсру)? если нет то создаешь лист, добавляешь туда начало почты и кидаешь его в мапу с этим ключом. Если уже есть, то берешь уже имеющийся в мапе листик по этому ключу и добавляешь туда начало почты.
и никаких регэкспов не надо
0
2433 / 1889 / 475
Регистрация: 17.02.2014
Сообщений: 9,124
29.08.2018, 11:46 9
а вот так, с учетом лексикографической сортировки строк?
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void main(String[] args) {
        ArrayList<String> arrStr = new ArrayList<>();
        arrStr.add("kavaganga@mail.ru");
        arrStr.add("alexPupkin@gmail.com");
        arrStr.add("nastya2018@gmail.com");
        arrStr.add("nabc@gmail.com");
        arrStr.add("karas@mail.ru");
        String separator = "@";
        for (int i = 0; i < arrStr.size(); i++) {
            arrStr.set(i, arrStr.get(i).split(separator)[1] + " > " + arrStr.get(i).split(separator)[0]);
        }
        Collections.sort(arrStr);
        for (String tmpStr : arrStr)
            System.out.println(tmpStr);
    }
ответ:
gmail.com > alexPupkin
gmail.com > nabc
gmail.com > nastya2018
mail.ru > karas
mail.ru > kavaganga
0
405 / 277 / 93
Регистрация: 14.03.2017
Сообщений: 777
29.08.2018, 11:58 10
Aviz__, простите, люблю рефакторить)
Java
1
2
3
4
5
6
7
8
9
10
11
Stream.of("kavaganga@mail.ru",
        "alexPupkin@gmail.com",
        "nastya2018@gmail.com",
        "nabc@gmail.com",
        "karas@mail.ru")
        .map(item -> {
            String[] splitted = item.split("@");
            return splitted[1] + " > " + splitted[0];
        })
        .sorted()
        .forEach(System.out::println);
0
2433 / 1889 / 475
Регистрация: 17.02.2014
Сообщений: 9,124
29.08.2018, 12:01 11
Цитата Сообщение от sdasdaw Посмотреть сообщение
простите
, так и быть, прощаю
0
Автоматизируй это!
Эксперт Python
6698 / 4260 / 1156
Регистрация: 30.03.2015
Сообщений: 12,515
Записей в блоге: 29
29.08.2018, 12:11 12
sdasdaw, прощаем, но выше написали что никаких лямбд! ) зарезали мой первый вариант
0
Эксперт Java
3638 / 2970 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
29.08.2018, 12:54 13
Цитата Сообщение от sdasdaw Посмотреть сообщение
.map(item -> {
* * * * * * String[] splitted = item.split("@");
* * * * * * return splitted[1] + " > " + splitted[0];
* * * * })
раз уж на то пошло, вот это надо заменить на два мапа
0
405 / 277 / 93
Регистрация: 14.03.2017
Сообщений: 777
29.08.2018, 13:43 14
xoraxax, спасибо)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.08.2018, 13:43
Помогаю со студенческими работами здесь

Регулярное выражение для имени пользователя
Ребята помогите с регулярным выражением.. Можете написать регулярное выражение для поля имени: ...

Регулярное выражение для Имени и Фамилии
Добрый день! Нужно запилить валидацию формы имени клиента с такими условиями: человек может ввести...

Регулярное выражение для имени покупателя
Здравствуйте, прошу вашей помощи, уже всю голову сломал. Проблема такая: Есть файл pdf в котором...

Регулярное выражение для имени пользователя
Друзья пожалуйста помогите с регуляркой. Ничего не понимаю в ней, хочу решить конкретный пример и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru