Wyciągnięcie adresu e-mail ze stringa.

0

Potrzebuję wyciągnąć adresy e-mail podane w stringu spośród innych danych.
Spróbowałem znaleźć znaczek @ i koniec czyli spacje ale nie mam pomysłu jak znaleźć początek e-mailu.
Nie wiem jak to zrobić za bardzo,ma ktoś jakiś pomysł?

#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;
void selektor(string s){
  const  string a="@";
  size_t malpa=s.find(a);
  size_t koniec=s.find(" ",malpa);
  cout<<malpa;
  cout<<koniec;
}
int main(int argc,char* argv[])
{
  string s;
  string x="END";
  const char* c_str=x.c_str();
  cout<<"Podaj dane osobowe do wczytania: \n";
  getline(cin,s,*c_str);
  selektor(s);
  return 0;
}

Mój dotychczasowy kod.

0

Możesz znaleźć pierwszą spację, której index jest mniejszy niż index @

np. "text [email protected] text2"

Index spacji: 5

Index mały: 13

Index drugiej spacji: 21

Lub możesz się też "cofać" od @ aż do znaku, który na pewno nie jest w mailu.

0

Tylko teraz jak to wykonać w kodzie :)

0
FrageN napisał(a):

Tylko teraz jak to wykonać w kodzie :)

Sprawdź który znak wcześniej == spacji, w kodzie ASCII bodajże 28 albo 92, musisz dotyczać bo ja już zamulony

0

To w miarę działa, ale założyłem, że w danym stringu jest tylko jeden mail i że delimiterem jest spacja za równo na początku jak i końcu maila. Optymalne to to nie jest. :D

#include <iostream>

std::string find_mail(std::string str)
{
    std::string buffer = ""; // container for result

    for (int i = 0; i < str.size(); i++) { // iterate through string
        if (str[i] == ' ') { // if space is found...
            if (buffer.find('@')!=std::string::npos) // and the buffer contains '@'...
                return buffer; // then the mail is found

            buffer = ""; // reset the buffer if space is found
            i++;    // this is needed, otherwise redundant space would be added
                    // at the start of the string
        }

        buffer = buffer + str[i]; // add current character to the buffer
    }
}

int main()
{
    std::string str = "ania ma [email protected] psa";
    std::string mail = find_mail(str);
    std::cout << mail;
}

edit: Można by rozważyć np. sytuację gdy w danym stringu w ogóle nie było podanego maila, albo niby był mail ale w ewidentnie złym formacie.

2

yyy... wiecie ze w C++11 macie regex?

tu masz przyklad na sprawdzenie czy email jest poprawny

#include <iostream>
#include <string>
#include <regex>

bool is_email_valid(const std::string& email)
{
   // define a regular expression
   const std::regex pattern
      ("(\\w+)(\\.|_)?(\\w*)@(\\w+)(\\.(\\w+))+");

   // try to match the string with the regular expression
   return std::regex_match(email, pattern);
}

int main()
{
    std::string email1 = "text.example@randomcom";

    std::cout << email1 << " : " << (is_email_valid(email1) ?
      "valid" : "invalid") << std::endl;
}

teraz jak juz wiesz jak sprawdzic czy to jest email w zadanym stringu, to masz juz polowe zadania skonczona. Teraz dopracuj sobie regexa by znajdowal email w stringu

1

Jak się używa C++11 i wyrażeń regularnych, to lepie użyć "raw string literal" (i "uniform initialization"). Moja wersja reg exp-a

   const std::regex pattern {
      R"exp([^ ,%&@]+@(\w+\.)+\w\w+)exp"
   };

Trzeba się też zastanowić jak agresywne ma być RE, żeby nie przedobrzyć z false negative (false positive jest mniej wnerwiające, bo istnieją jeszcze inne formy weryfikacji).
IMO takie coś to już przesada: \w+((\.|_)\w+)*(\+[\w._]+)@(\w+\.)+[a-z]{2,3}

IMO wyrażenia regularne w kodzie to samo zło, więc raczej bym ich unikał. Natomiast jest to świetna opcja konfiguracyjna.

1

Pełny regex do interpretowania adresów email wygląda tak:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

Wyszukaj go w podanym stringu i nie baw się w półśrodki.

2

1 użytkowników online, w tym zalogowanych: 0, gości: 1