使用regex[Java]按域对电子邮件登录数据进行分组



我有一个电子邮件列表,看起来像这样:

james; james@gmail.com
george; george@gmail.com
alex; alex@yahoo.com
anthony; anthony@yahoo.com
mike; mike@outlook.com

我需要这样组织他们:

james,george - gmail.com
alex,anthony - yahoo.com
mike - outlook.com

如何在Java中使用regex而不使用任何容器类和流来实现这一点?

您必须使用Map来存储每个域的名称列表。您可以在字符串上使用拆分方法,如下所示:

public static void main(String[] args) throws Exception {
String [] emails = {
"james; james@gmail.com",
"george; george@gmail.com",
"alex; alex@yahoo.com",
"anthony; anthony@yahoo.com",
"mike; mike@outlook.com"};

Map<String,List<String>> domains = new HashMap<>();
List<String> names = null;

for(String entry : emails) {
String[] data = entry.split(";|@");
if(domains.containsKey(data[2])){
names = domains.get(data[2]);
} else {
names = new ArrayList<>();
domains.put(data[2], names);
}
names.add(data[0]);
}

for(String key : domains.keySet()) {
System.out.println(domains.get(key) + " - " + key);
}
}

输出:

[mike] - outlook.com
[james, george] - gmail.com
[alex, anthony] - yahoo.com

不确定它与您的意图有多接近,但我尝试了一下:

String [] emails = {
"james; james@gmail.com",
"george; george@gmail.com",
"alex; alex@yahoo.com",
"anthony; anthony@yahoo.com",
"mike; mike@outlook.com"};
Map<String, String> mailMap = new HashMap<>();
Pattern p = Pattern.compile(" (.+)@(.+)");
for (String string : emails) {
Matcher m = p.matcher(string);
if (m.find( )) {
String name = m.group(1);
String mailProvider = m.group(2);

if (mailMap.containsKey(mailProvider)) {
String oldValue = mailMap.get(mailProvider);
mailMap.put(mailProvider, oldValue + "," + name);
} else {
mailMap.put(mailProvider, name);
}

} else {
System.out.println("String did match expected format");
}
}
for (String mailProvider : mailMap.keySet()) {
System.out.println(mailMap.get(mailProvider) + " - " + mailProvider);
}