2017-09-13 2 views
1

ceci est une continuation de mon précédent post, mon code:validation email regex

public class Main { 

static String theFile = "C:\\Users\\Pc\\Desktop\\textfile.txt"; 

public static boolean validate(String input) { 
    boolean status = false; 
    String REGEX = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@" 
      + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"; 

    Pattern pattern = Pattern.compile(REGEX); 
    Matcher matcher = pattern.matcher(input); 
    if (matcher.matches()) { 
     status = true; 
    } else { 
     status = false; 
    } 
    return status; 
} 

public static void main(String[] args) { 
    BufferedReader br = null; 

    try { 
     br = new BufferedReader(new FileReader(theFile)); 
     String line; 
     int count = 0; 
     while ((line = br.readLine()) != null) { 
      String[] arr = line.split("#"); 
      for (int x = 0; x < arr.length; x++) { 
       if (arr[x].equals(validate(theFile))) { 
        count++; 
       } 
       System.out.println("no of matches " + count); 

      } 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    Main.validate(theFile); 
} 

} 

Il montre Résultat: pas de matchs 0 pas de matchs 0 pas de matchs 0 pas de matchs 0

et ceci est mon texte dans le fichier d'entrée [email protected] # [email protected] # [email protected] #[email protected]

ma sortie doit être trois e-mails becaus e la dernière chaîne n'est pas un format standard e-mail Je sais que je suppose de ne pas passer (arr[x].validate(theFile)))

+0

avant d'écrire un validateur e-mail, s'il vous plaît jeter un oeil à ces [exemples d'adresses e-mail valides et invalides] (https://en.wikipedia.org/wiki/Email_address#Examples) – Andreas

+0

http: // emailregex .com –

Répondre

0

J'ai toujours utilisé ceci:

public static bool Validate(string email) 
    { 
     string expressions = @"^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"; 
     return Regex.IsMatch(email, expressions); 
    } 

Note: J'ai aussi une fonction qui « nettoie » la chaîne doit y avoir plusieurs symboles @ aussi.

Editer: Voici comment je nettoie les symboles supplémentaires @. Notez que cela gardera le PREMIER @ qu'il trouve et il suffit de retirer le reste. Cette fonction doit être utilisée AVANT d'exécuter la fonction de validation.

public static string CleanEmail(string input) 
    { 
     string output = ""; 

     try 
     { 
      if (input.Length > 0) 
      { 
       string first_pass = Regex.Replace(input, @"[^\w\[email protected]]", ""); 
       List<string> second_pass = new List<string>(); 
       string third_pass = first_pass; 
       string final_pass = ""; 

       if (first_pass.Contains("@")) 
       { 
        second_pass = first_pass.Split('@').ToList(); 

        if (second_pass.Count >= 2) 
        { 
         string second_pass_0 = second_pass[0]; 
         string second_pass_1 = second_pass[1]; 

         third_pass = second_pass_0 + "@" + second_pass_1; 

         second_pass.Remove(second_pass_0); 
         second_pass.Remove(second_pass_1); 
        } 
       } 

       if (second_pass.Count > 0) 
       { 
        final_pass = third_pass + string.Join("", second_pass.ToArray()); 
       } 
       else 
       { 
        final_pass = third_pass; 
       } 

       output = final_pass; 

      } 
     } 
     catch (Exception Ex) 
     { 

     } 

     return output; 
    } 
+0

Quelle est la fonction intéressante – valentine

+0

@valentine PM moi. –

+0

comment? Je suis nouveau @David Bentley – valentine

0

Il y a plusieurs erreurs dans votre code:

  1. if (arr[x].equals(validate(theFile))) vérifie si la chaîne d'adresse mail est égale à la valeur booléenne vous obtenez de la méthode validate(). Ce ne sera jamais le cas.
  2. Dans la méthode validate(), si vous voulez seulement vérifier si la chaîne correspond à une regex, vous pouvez simplement le faire avec string.matches(pattern) - donc vous n'avez besoin que d'une ligne de code (pas vraiment erreur, mais c'est plus élégant) Après la division de votre chaîne d'entrée (la ligne), il reste des espaces, car vous ne divisez que le symbole #. Vous pouvez trim() chaque chaîne après pour enlever les (voir le code ci-dessous) ou split() à \\s*#\\s* au lieu de simplement #

Voici un exemple avec tous les correctifs (j'ai quitté la partie où vous lisez le fichier et utilisé une chaîne avec vos adresses de courrier à la place):

public class Main { 

    private static final String PATTERN_MAIL 
     = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@" + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"; 

    public static boolean validate(String input) { 
     return input.matches(PATTERN_MAIL); 
    } 

    public static void main(String[] args) { 
     String line = "[email protected] # [email protected] # [email protected] #[email protected]"; 
     String[] arr = line.split("#"); 
     int count = 0; 

     for (int x = 0; x < arr.length; x++) { 
      if (validate(arr[x].trim())) { 
       count++; 
      } 
      System.out.println("no of matches " + count); 
     } 
    } 

} 

Il imprime:

no of matches 1 
no of matches 2 
no of matches 3 
no of matches 4 

EDIT: Si le motif est pas censé pour correspondre à la dernière adresse mail, vous devrez changer le motif. En ce moment, il correspond à tous.

+0

merci correction noté – valentine

+0

si ma réponse résout votre problème, vous pouvez le marquer comme accepté pour les autres à utiliser et pour mes points de prestige sans valeur :) – mumpitz