You need to enable JavaScript to run this app. Java中如何用正则表达式在不依赖容器类与流的前提下按域名分组邮箱登录数据
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何用正则表达式在不依赖容器类与流的前提下按域名分组邮箱登录数据

Java无容器无Stream的正则实现方案

实现核心思路

全程不使用Java集合框架的任何容器类、不调用Stream流式操作,完全依托正则的捕获组提取、定向替换、标记跳过能力完成同域名下的用户名归并,所有分组判断、内容提取、格式拼接逻辑都由正则匹配规则驱动。

完整可运行代码

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexGroupDemo {
    public static void main(String[] args) {
        // 原始输入数据
        String rawInput = """
                james; james@gmail.com
                george; george@gmail.com
                alex; alex@yahoo.com
                anthony; anthony@yahoo.com
                mike; mike@outlook.com
                """.trim();

        // 正则规则:拆分每行结构,捕获用户名、对应域名两个核心字段
        Pattern linePattern = Pattern.compile("(\\s*([^;]+);\\s+[^@]+@([^\\s]+)\\s*)");
        // 已处理行的标记前缀
        String processedMark = "#";

        Matcher lineMatcher = linePattern.matcher(rawInput);
        StringBuilder result = new StringBuilder();

        while (lineMatcher.find()) {
            // 直接跳过已经标记为处理过的行
            if (lineMatcher.group().startsWith(processedMark)) continue;
            String currentDomain = lineMatcher.group(3);
            // 正则匹配时对域名中的特殊字符做转义,避免匹配错误
            String escapedDomain = currentDomain.replace(".", "\\.");

            // 匹配所有当前域名对应的原始行
            Pattern sameDomainPattern = Pattern.compile(
                    "(?<mark>" + processedMark + "?)\\s*([^;]+);\\s+[^@]+@" + escapedDomain + "\\s*"
            );
            Matcher sameDomainMatcher = sameDomainPattern.matcher(rawInput);
            StringBuilder usernameCollector = new StringBuilder();

            while (sameDomainMatcher.find()) {
                // 跳过已经处理过的行
                if (!sameDomainMatcher.group("mark").isEmpty()) continue;
                // 拼接同域名的用户名
                if (usernameCollector.length() > 0) usernameCollector.append(",");
                usernameCollector.append(sameDomainMatcher.group(2).trim());
                // 给当前匹配的行加上已处理标记
                rawInput = sameDomainMatcher.replaceFirst(processedMark + sameDomainMatcher.group());
                // 重置matcher索引,避免替换后字符串位置错位导致漏匹配
                sameDomainMatcher.reset(rawInput);
            }

            // 拼接最终格式的行
            if (result.length() > 0) result.append("\n");
            result.append(usernameCollector).append(" - ").append(currentDomain);
        }

        System.out.println(result);
    }
}

运行输出效果

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

关键实现说明

  • 全程没有使用HashMap、ArrayList等存储型容器,仅用StringBuilder做临时字符串拼接,所有同组判断、去重识别都由正则匹配规则完成,满足零容器、零Stream的要求
  • 依靠行首#标记实现无存储结构的已处理条目识别:每次处理完对应行后打上标记,后续正则匹配时自动跳过,不需要额外的集合记录已处理的域名或行
  • 域名匹配阶段对.做转义处理,避免正则中.匹配任意字符导致的错配问题
  • 每次完成字符串替换操作后手动重置Matcher的搜索索引,解决内容修改后长度变化导致的索引错位漏匹配问题

内容的提问来源于stack exchange,提问作者techyyy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.29 00:54:04