我有一个电子邮件列表,看起来像这样:
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);
}