Имя: Пароль:
1C
 
получить адрес эл. почты из строки
0 Prog_man
 
гуру
10.03.26
15:58
Добрый день,
подскажите как эл.почту получить из строки?
сейчас код такой:

Подробности
Функция мПолучитьЭлПочтуОтправителя(Строка)
    
    Шаблон = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$";      
    
    RegExp = Новый COMОбъект("VBScript.RegExp");
    RegExp.Global = Истина;
    RegExp.Pattern = Шаблон;
    
    Результат = Новый Массив;
    
    Matches = RegExp.Execute(Строка);
    Для Каждого Match Из Matches Цикл
        Результат.Добавить(Match.Value);
    КонецЦикла;
    
    Возврат Результат;  
КонецФункции    


возвращает пустой массив
платформа 1С:Предприятие 8.5 (8.5.1.1150)
1 Мультук
 
гуру
10.03.26
15:22
(0)

А как быть с адресами а-ля

мультук@миста.рф

?

[хе-хе]
2 Prog_man
 
гуру
10.03.26
15:27
(1) с регулярками ранее не работал, может шаблон не верный (то что нагуглил), почта типа мультук@миста.рф, в 1с может и не грузиться
3 ads55
 
10.03.26
15:30
(2) а почему не ищешь разницу между первый пробел до "@" и первый пробел после "@"?

Так же проще, чем регулярки?
4 Chameleon1980
 
10.03.26
15:40
(3) наверное, "мы не ищем легких путей" :)
5 Prog_man
 
гуру
10.03.26
15:44
(3) хотел регулярки по юзать )) по сабжу то есть варианты, почему пустой массив?
6 ads55
 
10.03.26
15:49
(5) "по сабжу то есть варианты" - нет. Больше не мешаю.
"[a-zA-Z0-9.-]+\" - вот это - 9."-"]+"\" - кавычками лишнее выделил.
7 JohnGilbert
 
10.03.26
15:50
https://stepik.org/course/107335/syllabus

Бесплатная часть по синтаксису регулярок проходится за 4-5 часов. Вопросы отпадут быстро.
8 JohnGilbert
 
10.03.26
15:51
А на кой ляд VBScript.RegExp, если есть СтрНайтиПоРегулярномуВыражению?
9 rozer76
 
10.03.26
15:55
(0) Шаблон = "^[a-zA-Zа-яА-Я0-9._%+-]+@[a-zA-Zа-яА-Я0-9.-]+\.[a-zA-Zа-яА-Я]{2,}$";
10 rozer76
 
10.03.26
15:56
+ (9) случай в (1) обработает
11 rozer76
 
10.03.26
15:57
(8) платформа старая
12 Prog_man
 
гуру
10.03.26
15:57
(8) тестил, тоже не работало, видимо в шаблоне дело
13 Prog_man
 
гуру
10.03.26
15:58
(11) 1С:Предприятие 8.5 (8.5.1.1150)
14 Timon1405
 
10.03.26
15:58
(0) у Вас в выражении ^ и $ лишние: это якоря начала и конца строки, то есть подходят только строки которые являются емэйлом, но не содержат где-то емэйл
15 JohnGilbert
 
10.03.26
16:01
[\w\d.-]+@[\w]+.[\w]+
А дальше уже думать, что у тебя в начале и в конце (^&) или (\b)
16 JohnGilbert
 
10.03.26
16:03
(13) Значит используй СтрНайтиПоРегулярномуВыражению
17 Prog_man
 
гуру
10.03.26
16:04
(16) видимо так и сделаю, сейчас проверю шаблон
18 JohnGilbert
 
10.03.26
16:05
(17) https://regex101.com/ здесь можно регулярки отлаживать, помогает. А так респект за неиспользование способа из (3).
19 Timon1405
 
10.03.26
16:11
(17) RegExp.Ignorecace = истина надо ставить, у вас буквы только большие в шаблоне. в СтрНайтиПоРегулярномуВыражению оно 3м параметром идет, тоже важно истину писать
20 Prog_man
 
гуру
10.03.26
16:13
благодарю, получилось
21 JohnGilbert
 
10.03.26
16:14
(19) Очень спорный совет
22 Prog_man
 
гуру
10.03.26
16:15
(19) ок, вроде и так работает
23 JohnGilbert
 
10.03.26
16:16
(22) Не надо. \w - уже буквы в верхней и нижней раскладке.
24 Prog_man
 
гуру
10.03.26
16:21
(23) 👍
25 probably
 
10.03.26
16:37
{2,} - это означает 2 символа? то есть адреса типа .com не не рассматриваются?
а так же, правильно ли я понимаю, что не рассматриваются адреса формата jet.msk.su?
26 Мимохожий Однако
 
10.03.26
16:39
БСП 3.2.1 Результат = ОбщегоНазначенияКлиентСервер.АдресаЭлектроннойПочтыИзСтроки(СписокАдресов)
27 Timon1405
 
10.03.26
16:40
(25) это 2+ символа, то есть .ru .com .other подойдет, а .z не подойдет
28 Fish
 
гуру
10.03.26
16:40
(26) Ну вот. Сразу с козырей зашел.
29 JohnGilbert
 
10.03.26
16:43
(15) Точки экранировать забыл.
(25) [\w\d\.-]+@[\w]+\.[\w\.]+ так найдет адреса с любым количеством точек
30 JohnGilbert
 
10.03.26
16:46
(29) [\w\d\.-]+@[\w\.]+
упрощается до такой формы. \w не содержит пробел.
31 Fish
 
гуру
10.03.26
16:53
(30) Неправильно. кривой адрес типа  fgdfg@ya..ya__ находит
32 JohnGilbert
 
10.03.26
16:56
(31) Согласен) Но, если речь про реальные адреса почты, мы такой не встретим, т.к. там ограничения почтовых сервисов на нейминг. Если искать в сыром тексте адреса имейлов, то будет куча корнер кейсов, которые надо обыгрывать, как ваш.
33 Fish
 
гуру
10.03.26
16:59
(32) На самом деле вариант (26) решает задачу. В т.ч. и проводит проверку корректности адреса. Зачем, как Гений, изобретать велосипеды?
34 JohnGilbert
 
10.03.26
17:00
(33) Спорить не буду вовсе. Регулярки - чисто академический интерес. Пару раз меня выручили, там где типовых методов нет.
В ситуации ТС использовать метод из (26) лучший вариант.
35 Fish
 
гуру
10.03.26
17:02
(32) "если речь про реальные адреса почты, мы такой не встретим" - Речь в (0) про получение адреса из строки. Откуда взята эта строка - неизвестно, и реальные там адреса или баба Маня руками с бумажки вбивает, тоже неизвестно. Поэтому, имхо, лучше проверять корректность, чем не проверять.
36 JohnGilbert
 
10.03.26
17:04
(35) Вы правы. Т.к. уточнений про бабу Маню не было, я исходил из реальных адресов.
Метод из (26) вроде тоже это не решает.
// Параметры:
//  СписокАдресов - Строка - адреса электронной почты, разделитель - запятая, либо точка с запятой:
//                           Получатель1 <Адрес1>, Получатель 2 <Адрес2>... Получатель N <АдресN>.
Тут тоже придётся адреса найти и передать.
37 Prog_man
 
гуру
10.03.26
17:18
(35) там типовой текст, из заявки с сайта, т.е. если в форму обратной связи, заполнят не корректный адрес, то почта и не придет. в самой форме тоже проверка на корректность адреса эл. почты. (26) видимо не подойдет, там список адресов нужно передавать.
38 Мимохожий Однако
 
10.03.26
17:48
(37) Проверял или предполагаешь?
39 Garykom
 
гуру
10.03.26
18:55
https://habr.com/ru/articles/320572/
Итог

Бессмысленно пытаться выяснить, является ли адрес «действительным». Пользователь с гораздо большей вероятностью введёт неправильный и действительный адрес, чем недействительный.

Поэтому лучше потратить своё время буквально на любое другое дело, чем проверять валидность адресов электронной почты.

На 100% правильный способ

Высылайте пользователям письмо активации. (Здесь жирная точка для эффекта).
40 Garykom
 
гуру
10.03.26
19:01
Поиск email в строке очень простой:
1. Находим @
2. Находим все слева и справа от @ до первого символа который недопустим в email (разделителя)
3. Все что посередине с @ = email!
41 Garykom
 
гуру
10.03.26
18:58
(40)+ Если надо найти несколько email в строке - использовать рекурсию
После выкусывания первого email из строки, остаток подаем заново на вход
42 Волшебник
 
10.03.26
19:25
(39)(40)  Присоединяюсь к мнению. В общем виде задача нерешаемая без Попытка...Исключение.
43 Кирпич
 
11.03.26
11:02
(0) у тя регулярка проверяет не является ли строка адресом email, а не ищет адреса в тексте. Поставь спереди (\s|^) вместо ^ и сзади (\s|$) вместо $
44 Кирпич
 
11.03.26
11:05
А еще лучше типа такого (?:\s|^)
45 Кирпич
 
11.03.26
11:19
А еще лучше вабще убрать ^ и $ :)
46 DrZombi
 
гуру
12.03.26
06:23
(0) Держите ИИ Гугл накопал :)
Серьёзно, ну не писать же обыденное за вас ;)

Пример кода от ИИ Гугла, как искать адрес в строке
bsl
&НаКлиентеНаСервереБезКонтекста
Функция ИзвлечьEmailИзСтроки(Знач ВходнаяСтрока)
    
    // Список символов, которые НЕ могут быть частью адреса
    Разделители = " ,;()<>[]{}!/|'""\?" + Символы.ПС + Символы.ВК + Символы.Таб;
    
    ПозицияСобаки = СтрНайти(ВходнаяСтрока, "@");
    
    Если ПозицияСобаки = 0 Тогда
        Возврат "";
    КонецЕсли;
    
    // Идем влево от @ до первого разделителя
    НачалоАдреса = 1;
    Для Счетчик = 1 По ПозицияСобаки - 1 Цикл
        Символ = Сред(ВходнаяСтрока, ПозицияСобаки - Счетчик, 1);
        Если СтрНайти(Разделители, Символ) > 0 Тогда
            НачалоАдреса = ПозицияСобаки - Счетчик + 1;
            Прервать;
        КонецЕсли;
    КонецЦикла;
    
    // Идем вправо от @ до первого разделителя
    КонецАдреса = СтрДлина(ВходнаяСтрока);
    Для Счетчик = 1 По КонецАдреса - ПозицияСобаки Цикл
        Символ = Сред(ВходнаяСтрока, ПозицияСобаки + Счетчик, 1);
        Если СтрНайти(Разделители, Символ) > 0 Тогда
            КонецАдреса = ПозицияСобаки + Счетчик - 1;
            Прервать;
        КонецЕсли;
    КонецЦикла;
    
    Результат = Сред(ВходнаяСтрока, НачалоАдреса, КонецАдреса - НачалоАдреса + 1);
    
    // Минимальная проверка: точка после @
    Если СтрНайти(Результат, ".", , СтрНайти(Результат, "@")) > 0 Тогда
        Возврат Результат;
    Иначе
        Возврат "";
    КонецЕсли;
    
КонецФункции

// Пример вызова:
// Адрес = ИзвлечьEmailИзСтроки("Напишите нам на почту support@company.ru до завтра");
// Сообщить(Адрес); // Выведет: support@company.ru
47 DrZombi
 
гуру
12.03.26
06:27
+(0)  Проверка... https://infostart.ru/1c/articles/192489/
48 ads55
 
12.03.26
08:25
(47) ему и в (3) и в (40) тоже самое предлагали, но ему надо другое :)
49 Prog_man
 
гуру
12.03.26
09:49
(46) (48) с регуляркой функция получилась в 5 строк

Подробности
Функция мПолучитьЭлПочтуОтправителя(Текст)
    РегулярноеВыражение = "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}";
    РезультатыПоиска = СтрНайтиВсеПоРегулярномуВыражению(Текст, РегулярноеВыражение);

АдресОтправителя  = РезультатыПоиска[0].значение;
    Возврат АдресОтправителя;
    
КонецФункции  


у меня функция чуть больше на пару строк, и вариант в (0) тоже рабочий, только нужно шаблон (РегулярноеВыражение) заменить.
Задача была простая, получить первый адрес эл.почты, а если бы нужно было получить все адреса из текста, то регулярка возвращает массив всех найденных адресов, что очень удобно.
50 Timon1405
 
12.03.26
12:35
(49) функция, упадёт на ровном месте
мПолучитьЭлПочтуОтправителя("123") = "Индекс находится за границами массива"
51 Prog_man
 
гуру
12.03.26
16:07
(50) С чего ей падать? в функцию передается текст, шаблон текста заранее известен (в моем случае). Для других случаев можно доработать функцию. Как вариант обернуть в Попытка Исключение, в исключении возвращать пустое значение, далее обрабатывать в месте вызова функции. В твоем примере не верный параметр, так можно и другие функции ронять, передавая не верные параметры.
52 Кирпич
 
12.03.26
17:05
(51) как с чего ей падать. Если в тексте не окажется email, с того и падать
53 Prog_man
 
гуру
12.03.26
17:18
(52) что мешает доработать функцию, чтобы возвращала пустую строку, если email не найден ? у меня не было задачи сделать универсальную функцию на все случаи. вопрос решен, тему можно закрывать.
54 uno-group
 
13.03.26
10:01
Искать надо пробелы. Никто не запрещает емейлы вида
ivanov.ivan.ivanovich @ td.brak.sbit.zagran.postavka.com.ru
Запаришься шаблон писать.
55 uno-group
 
13.03.26
10:03
поискал для примера 2 точки после сабаки у меня 9% емейлев. с 3 точками 7 штук нашел.
56 Prog_man
 
гуру
13.03.26
10:09
(54) если про шаблон текста, то в моем случае все просто, это заявка с сайта из формы обратной связи, и да там тоже проверка адреса электронной почты, т.е. если адрес не корректный, то заявка с сайта и не придет на почту. а если придет, то как минимум один адрес электронной почты будет из формы обратной связи. но не все адреса поддерживаются, например кириллицей не пройдет.
57 Prog_man
 
гуру
13.03.26
10:22
(54) проверил, без пробелов норм. с пробелами не отправляется
ivanov.ivan.ivanovich@td.brak.sbit.zagran.postavka.com.ru
58 uno-group
 
13.03.26
10:25
(57)если норм то все отлично. Пробелы я вставил так как сайт без пробелов у меня @ не отображал.
Ошибка? Это не ошибка, это системная функция.