You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正则表达式匹配Java枚举无结果,求排查问题原因

问题分析与修正方案

你的代码无法返回枚举值,核心问题出在正则匹配的逻辑细节上,以下是具体原因和修正方案:

错误原因

  1. 正则表达式的冗余与潜在问题:你使用的^.*?_BED和^.*?_DOOR中的非贪婪模式.*?在这里完全没必要,虽然理论上能匹配目标字符串,但如果枚举值出现多下划线场景,可能导致匹配异常。更关键的是,原正则没有明确匹配字符串结尾,逻辑上不够严谨。
  2. 匹配方式与取值逻辑:使用while(m.find())循环遍历匹配结果,对于单个枚举值的名称来说完全多余——要么整个字符串符合正则,要么不符合。另外,你通过m.group()获取匹配内容,虽然当前场景能拿到正确值,但如果正则后续添加分组,很容易出现取值错误,直接使用type.name()更可靠。

修正后的代码

方案一:保留多正则列表的写法

public Set<String> getTypes() {
    Set<String> foundTypes = Sets.newHashSet();
    List<String> regexPatterns = Lists.newArrayList("^.*_BED$", "^.*_DOOR$");

    for (String regexPattern : regexPatterns) {
        Pattern pattern = Pattern.compile(regexPattern);

        for (Types type : Types.values()) {
            String name = type.name();
            Matcher m = pattern.matcher(name);

            if (m.matches()) {
                foundTypes.add(name);
            }
        }
    }

    return foundTypes;
}

方案二:使用组合正则简化代码

如果不需要维护多正则列表,可以把两个正则合并成一个,让代码更简洁:

public Set<String> getTypes() {
    Set<String> foundTypes = Sets.newHashSet();
    Pattern pattern = Pattern.compile("^.*_(BED|DOOR)$");

    for (Types type : Types.values()) {
        String name = type.name();
        if (pattern.matcher(name).matches()) {
            foundTypes.add(name);
        }
    }

    return foundTypes;
}

这两种方案都能正确返回所有以_BED或_DOOR结尾的枚举值名称。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 09:58:13