JAVA Regex — как мне исключить определенное расширение электронной почты?

#java #regex

#java #регулярное выражение

Вопрос:

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

Я пробовал использовать такие теги, как ?! с помощью инструкций и не дали никаких результатов. У меня нет большого опыта в регулярных выражениях, поэтому мои попытки пронумерованы.

 import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Emails {
    public static void main(String args[]) throws IOException {
        Scanner scanner = new Scanner(new File("rajeev.dat"));

        ArrayList<String[]> lines = new ArrayList<>();

        Pattern regex = Pattern.compile("(?!^([A-Za-z0-9.] (?!@Google.org)|[A-Za-z0-9.] (?!@Yahoo.net)))");
        Pattern findComma = Pattern.compile(",");

    while(scanner.hasNextLine()){
        lines.add(scanner.nextLine().split(","));
    }

    for(String[] s: lines){
        for(String s1: s){
            System.out.println(s1);
        }
        System.out.println();
    }


    String temp = "";

    String output = "";

    output  = lines.get(0)[0]   ":"   lines.get(0)[1]   ":";

    for(int i = 2; i < lines.get(0).length; i  ){
        temp  = lines.get(0)[i]   " ";
    }

        System.out.println(temp);

    Matcher match = regex.matcher(temp);
    String temp2 = "";
    boolean nofail = false;

        while(match.find()){
            output  = match.group().trim()   ":";
            nofail = true;
        }


        if(nofail) {
            System.out.println(output);
        }


    }
}
  

Ожидается, что программа будет сортировать любые электронные письма с расширениями, которые не @Google.org или @yahoo.net

Программа не находит совпадений

Ответ №1:

Можете ли вы попробовать это? https://regex101.com/r/hbnvr8/1 /

 Pattern.compile("^([A-Za-z0-9.] (\.?) ([A-z0-9]?)) @(?!(Yahoo.net|Google.org)$)[A-z] \.[A-z] $")
  

Ответ №2:

Вы могли бы использовать отрицательный прогноз (?!Google.org|Yahoo.net) , чтобы утверждать, что то, что находится непосредственно справа от @ , тоже не является Google.org или Yahoo.net . Обратите внимание, чтобы избежать точки, чтобы соответствовать ей буквально.

Если единственные символы, которые вы хотите разрешить, перечислены в вашем классе символов [A-Za-z0-9.] , вы можете использовать регулярное выражение, которое сначала соответствует классу символов без точки, используя [A-Za-z0-9]

Затем повторите часть 0 раз, начиная с точки, используя (?:.[A-Za-z0-9])* , чтобы электронное письмо не начиналось или не заканчивалось точкой.

Обратите внимание, что вы можете расширить классы символов, чтобы разрешить больше символов.

 ^[A-Za-z0-9] (?:.[A-Za-z0-9])*@(?!Google.org|Yahoo.net)[A-Za-z0-9] (?:.[A-Za-z0-9])*.w $
  

В Java

 String regex = "^[A-Za-z0-9] (?:\.[A-Za-z0-9])*@(?!Google\.org|Yahoo\.net)[A-Za-z0-9] (?:\.[A-Za-z0-9])*\.\w $";
  

Демонстрация регулярных выражений

Ответ №3:

Получил этот шаблон, работающий на regextester:

 ^([A-z0-9] (.?) ([A-z0-9]?)) @(?!(Yahoo.net|Google.com))[A-z] .[A-z] $