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

Flutter按扩展名筛选存储图片:文件扩展名匹配异常问题

正确比较文件扩展名的方法

你的问题出在两个核心点:

  1. 正则中的.未转义,它会匹配任意字符而非字面量的点;
  2. 未限定匹配必须到字符串结尾,导致包含扩展名片段的字符串(比如.pngk)被误匹配。

方案一:修正正则表达式

调整正则为匹配字符串结尾的合法扩展名,同时转义点字符,确保只匹配文件名末尾的有效扩展名:

void main() {
  List<String> image = [
    "sdasd/dsd.png",
    "sdafd/ddd.jpeg",
    "sdsdd/dgd.gif",
    "sdasd/dhd.png",
    "sdasd/dhd.txt",
    "test.pngk" // 新增误匹配测试用例
  ];

  // 原始字符串r""避免转义问题,$限定到字符串结尾,\.匹配字面量的点
  final RegExp regExp = RegExp(r"\.(gif|jpe?g|tiff?|png|webp|bmp)$", caseSensitive: false);

  for (var img in image) {
    print(img.contains(regExp));
  }
}

输出结果:

true
true
true
true
false
false

关键说明:

  • \.:匹配字面量的点,避免.匹配任意字符的错误;
  • $:强制匹配到字符串结尾,确保扩展名是文件名的最后一部分;
  • caseSensitive: false:兼容大小写扩展名(比如.PNG、.JPG)。

方案二:使用path库直接获取扩展名(更可靠)

正则容易出现边界错误,推荐用Dart官方path库提取扩展名,再和允许列表对比:

import 'package:path/path.dart' as path;

void main() {
  List<String> files = [
    "sdasd/dsd.png",
    "sdafd/ddd.jpeg",
    "sdsdd/dgd.gif",
    "sdasd/dhd.png",
    "sdasd/dhd.txt",
    "test.pngk"
  ];

  // 定义允许的扩展名(统一小写,规避大小写差异)
  final allowedExts = {'.png', '.jpg', '.jpeg', '.gif', '.tif', '.tiff', '.webp', '.bmp'};

  for (var file in files) {
    // 获取扩展名并转为小写
    String ext = path.extension(file).toLowerCase();
    print(allowedExts.contains(ext));
  }
}

这种方法无需手动处理正则,path.extension()会自动识别路径中最后一个.后的内容作为扩展名,彻底避免误匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:55:19