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

如何实现从Java正则字符串中解析文件扩展名的方法?

问题1:能否直接通过Java Pattern对象提取分组而不用匹配输入文本?

不行。Java标准库的Pattern类没有提供公开API可以直接读取正则表达式内部的分组内容,结合你当前固定的两种模式格式,直接解析字符串的方案反而更简单高效。


最佳实现方案

因为你已经明确正则格式只有固定的两种,我们只需要匹配提取两种模式中括号包裹的、用|分隔的扩展名列表即可,实现步骤如下:

  1. 先清洗输入的正则字符串:去掉外层双引号、首尾的/、末尾的大小写不敏感标记i
  2. 写正则匹配规则抓取扩展名分组部分:匹配(开头,后面跟着由字母数字组成、用|分隔的内容,结尾是)
  3. 把抓到的内容按|拆分就得到扩展名列表
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexExtParser {
    // 专门匹配两种固定模式中的扩展名分组的正则
    private static final Pattern EXT_GROUP_PATTERN = Pattern.compile("\\(([a-z0-9|]+)\\)", Pattern.CASE_INSENSITIVE);

    public static List<String> getFileExtensionsFromRegex(String regexStr) {
        List<String> extensions = new ArrayList<>();
        // 第一步:清洗输入字符串,去掉外层引号、首尾的/和末尾的i
        String cleanPattern = regexStr
                .replace("\"", "")
                .replaceAll("^/|/i$", "");

        // 第二步:匹配扩展名分组
        Matcher matcher = EXT_GROUP_PATTERN.matcher(cleanPattern);
        if (matcher.find()) {
            String groupContent = matcher.group(1);
            // 按|拆分得到所有扩展名
            String[] extArr = groupContent.split("\\|");
            for (String ext : extArr) {
                if (!ext.isBlank()) {
                    extensions.add(ext);
                }
            }
        }
        return extensions;
    }

    // 测试用例
    public static void main(String[] args) {
        String one = "\"/^[^.]+$|\\.(?!(avi|bmp)$)([^.]+$)/i\"";
        String two = "\"/^.*\\.(txt)$/i\"";
        System.out.println(getFileExtensionsFromRegex(one)); // 输出 [avi, bmp]
        System.out.println(getFileExtensionsFromRegex(two)); // 输出 [txt]
    }
}

注意事项

该实现仅适配你给出的两种固定正则格式,如果后续格式变动需要对应调整匹配规则;如果需要校验提取结果合法性,可以在拆分后增加扩展名格式校验逻辑,比如仅保留纯字母数字的内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 04:36:01