#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] $