
本文讲解如何将字符串数组中含分号(;)的元素正确拆分为多个独立邮箱地址,并将其无缝合并到原数组中,避免重复添加原始元素,同时处理前后空格问题。
本文讲解如何将字符串数组中含分号(`;`)的元素正确拆分为多个独立邮箱地址,并将其无缝合并到原数组中,避免重复添加原始元素,同时处理前后空格问题。
在 Java 开发中,常需处理类似「一个字符串包含多个用分号分隔的邮箱 HTML 片段」的场景。例如,原始数组中某个元素为:"<a ...>[email protected]</a>; <a ...>[email protected]</a>",目标是将其拆解为两个独立元素,再与其他未含分号的元素共同组成扁平化的新数组。
关键问题在于:原始实现错误地同时保留了原始字符串和其拆分结果,导致冗余;且未清理分号两侧可能存在的空格,造成邮箱前/后带空格(如 " [email protected] "),影响后续解析或校验。
✅ 正确做法是:对每个元素统一执行 split("\s*;\s*") —— 使用正则表达式匹配任意数量空白字符包围的分号,然后将所有拆分结果直接加入 ArrayList,完全跳过原始元素本身。这样既保证逻辑简洁,又彻底避免重复。
以下是推荐的完整实现:
import java.util.*;
public class EmailArraySplitter {
public static void main(String[] args) {
String[] mailToCc = {
"<a class='"__cf_email__"' data-cfemail='"b1d2d9c3d8c2d5d6d2868885f1d6dcd0d8dd9fd2dedc"' href="%5C%22/cdn-cgi/l/email-protection%5C%22">[email protected]</a>; <a class='"__cf_email__"' data-cfemail='"ceada6bca7bdbaa7afa0e0a9afa3acaf8eadafbdbae0ada1a3e0beb7"' href="%5C%22/cdn-cgi/l/email-protection%5C%22">[email protected]</a>;",
"<a class='"__cf_email__"' data-cfemail='"4c222338252922290c2b212d2520622f2321"' href="%5C%22/cdn-cgi/l/email-protection%5C%22">[email protected]</a>"
};
List<string> updatedList = new ArrayList();
for (String element : mailToCc) {
// 使用 \s*;\s* 精确分割:忽略分号前后的空白(空格、制表符等)
String[] parts = element.split("\s*;\s*");
updatedList.addAll(Arrays.asList(parts));
}
// 转回数组(如需)
String[] result = updatedList.toArray(new String[0]);
System.out.println("拆分后数组:");
Arrays.stream(result).forEach(System.out::println);
}
}</string>
? 注意事项与最佳实践:
- ✅ 始终使用
\s*;\s*而非简单的";",否则拆分后可能残留空格(如" [email protected] "),引发后续trim()误判或 DOM 解析异常; - ❌ 避免在循环中先
add(element)再addAll(split)—— 这是导致原始输出出现重复项(如首元素被保留又拆分)的根本原因; - ⚠️ 若业务要求严格保留原始 HTML 结构(如
<a></a>标签中的data-cfemail属性),本方法完全安全,因拆分仅作用于字符串层级,不解析或修改标签内容; - ? 如需进一步清洗(如去除末尾分号、过滤空字符串),可在
split后链式调用.stream().filter(s -> !s.trim().isEmpty()).toArray(String[]::new)。
最终输出即为纯净、扁平、无冗余的邮箱 HTML 元素数组,可直接用于邮件发送、前端渲染或后续正则提取真实邮箱地址(如从 data-cfemail 解码)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











