
本文介绍在Java中将包含分号分隔邮箱(或其他内容)的字符串数组进行扁平化处理:遍历每个元素,按;(忽略前后空格)分割,将所有子项作为新元素加入结果数组,避免重复添加原始复合元素。
本文介绍在java中将包含分号分隔邮箱(或其他内容)的字符串数组进行扁平化处理:遍历每个元素,按`;`(忽略前后空格)分割,将所有子项作为新元素加入结果数组,避免重复添加原始复合元素。
在实际开发中(如解析邮件收件人列表、CSV式输入或HTML混淆邮箱字段),常遇到类似场景:一个字符串数组中某些元素本身是多个值用分号(;)拼接而成(例如 <a>user1@example.com</a>; <a>user2@example.com</a>),而我们需要将其“展开”为标准的一维数组,每个邮箱独占一个位置。
核心问题在于:不能既保留原始复合字符串,又添加其拆分结果——这会导致重复(如示例中首元素被原样保留,又额外拆出两个子项,造成冗余)。正确做法是:对每个元素统一执行 split,仅将拆分后的纯净子串加入结果集合。
✅ 推荐解决方案(简洁健壮)
使用正则表达式 \s*;\s* 进行分割,可自动忽略分号前后的空白字符(如空格、换行),避免生成带多余空格的脏字符串:
import java.util.*;
public class EmailArrayFlattener {
public static void main(String[] args) {
String[] mailToCc = {
"<a class="__cf_email__" data-cfemail="b1d2d9c3d8c2d5d6d2868885f1d6dcd0d8dd9fd2dedc" href="/cdn-cgi/l/email-protection">[email protected]</a>; <a class="__cf_email__" data-cfemail="ceada6bca7bdbaa7afa0e0a9afa3acaf8eadafbdbae0ada1a3e0beb7" href="/cdn-cgi/l/email-protection">[email protected]</a>;",
"<a class="__cf_email__" data-cfemail="4c222338252922290c2b212d2520622f2321" href="/cdn-cgi/l/email-protection">[email protected]</a>"
};
List<String> flattened = new ArrayList<>();
for (String element : mailToCc) {
// 按分号分割,自动去除前后空格
String[] parts = element.split("\s*;\s*");
flattened.addAll(Arrays.asList(parts));
}
// 转回数组(如需)
String[] result = flattened.toArray(new String[0]);
System.out.println("Flattened array: " + Arrays.toString(result));
}
}✅ 输出效果(与预期一致):
["<a ...>[email protected]</a>", "<a ...>[email protected]</a>", "<a ...>[email protected]</a>"]
⚠️ 注意事项
-
不要手动添加原始元素:原始代码中
updatedMailToCc.add(element)是错误根源,必须移除; - *正则中的 `s
很关键**:";"会保留空格,导致" [email protected]"类似脏数据;s;s` 确保干净切割; -
空字符串防护(可选增强):若输入可能含连续分号(如
a;;b),可过滤空项:Arrays.stream(parts) .filter(s -> !s.trim().isEmpty()) .forEach(flattened::add); -
性能提示:对于超大数组,
ArrayList+addAll效率优于频繁add();必要时可预估容量(new ArrayList(estimatedSize))。
✅ 总结
该操作本质是「数组扁平化(flattening)」:将嵌套结构(分号作为逻辑分隔符)转为一维列表。关键思维转变是——每个源元素不是“是否要拆”,而是“拆完取全部”。配合鲁棒的正则分割与 ArrayList 的动态扩容能力,即可安全、清晰、高效地完成需求。

















