
本文介绍在 Java 中将字符串数组中以分号(;)分隔的多个 HTML 邮箱链接正确拆分,并将各部分作为新元素追加到原数组的实用方法,重点解决空格残留与重复添加问题。
本文介绍在 java 中将字符串数组中以分号(`;`)分隔的多个 html 邮箱链接正确拆分,并将各部分作为新元素追加到原数组的实用方法,重点解决空格残留与重复添加问题。
在处理前端混淆邮箱(如 Cloudflare 的 data-cfemail 保护)生成的 HTML 字符串数组时,常遇到单个数组元素内包含多个邮箱链接、以分号 ; 分隔的情况(例如 <a>user1@example.com</a>; <a>user2@example.com</a>)。目标是将其“扁平化”为每个邮箱链接独占一个数组元素,而非保留原始复合项。
核心问题在于:原始代码既保留了原始字符串(updatedMailToCc.add(element)),又无条件添加了 split() 结果,导致重复(如原字符串 "A; B" 会同时存入 "A; B"、"A"、"B")。此外,split(";") 默认不处理分号前后的空格,易产生带首尾空格的脏字符串(如 " <a>...</a>"),影响后续解析或校验。
✅ 正确做法是:只添加拆分后的纯净子项,彻底舍弃原始复合字符串。推荐使用正则 \s*;\s* 进行分割——s* 表示零或多个空白字符(空格、制表符等),确保分号两侧空格被自动剥离:
import java.util.*;
public class EmailArrayFlattener {
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@example.com]</a>; <a class='"__cf_email__"' data-cfemail='"ceada6bca7bdbaa7afa0e0a9afa3acaf8eadafbdbae0ada1a3e0beb7"' href="%5C%22/cdn-cgi/l/email-protection%5C%22">[email@test.org]</a>",
"<a class='"__cf_email__"' data-cfemail='"4c222338252922290c2b212d2520622f2321"' href="%5C%22/cdn-cgi/l/email-protection%5C%22">[email@demo.net]</a>"
};
List<string> flattened = new ArrayList();
for (String element : mailToCc) {
// 使用 \s*;\s* 精确分割,自动清理分号周围空格
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));
// 输出包含 3 个独立邮箱链接元素的数组
}
}</string>
⚠️ 注意事项:
-
勿混用原始项与子项:切忌在循环中既
add(element)又addAll(split),这是导致结果膨胀的根本原因; -
正则转义不可省略:Java 字符串中反斜杠需双写,
\s*;\s*才等价于正则s*;s*; -
空字符串防护(可选增强):若输入可能含连续分号(如
"A;;B"),可在addAll前过滤空字符串:Arrays.stream(parts).filter(s -> !s.trim().isEmpty()).forEach(flattened::add); - HTML 安全提示:本文仅处理字符串结构,实际项目中若需解析/提取邮箱地址,请结合 JSOUP 等库解析 DOM,避免正则解析 HTML 引发脆弱性。
通过此方法,你将获得真正扁平化、无冗余、空格洁净的邮箱链接数组,为后续去重、验证或邮件发送逻辑奠定可靠数据基础。










