Flutter按扩展名筛选存储图片:文件扩展名匹配异常问题
正确比较文件扩展名的方法
你的问题出在两个核心点:
- 正则中的
.未转义,它会匹配任意字符而非字面量的点; - 未限定匹配必须到字符串结尾,导致包含扩展名片段的字符串(比如
.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
相关产品推荐
相关产品推荐

