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

如何编写正则表达式筛选合法且文件名与扩展名间不含_min的图片文件?

正确的正则表达式解决方案

你的问题出在正向负前瞻的位置不对——它没法精准判断_min是不是刚好出现在文件名和扩展名之间(也就是点号的前四位)。我们需要用负向后顾断言来准确排除这种情况。

正确的正则表达式

^\w+(?<!_min)\.(jpg|gif)$

为什么这个正则能生效?

我们拆解一下各个部分的作用:

  • ^:匹配字符串起始位置,确保从文件名开头开始检查
  • \w+:匹配由字母、数字、下划线组成的文件名主体(完全符合你要求的文件名规则)
  • (?<!_min):负向后顾断言——它会检查当前位置(也就是点号\.的前面),确保前面的内容不是以_min结尾。这正好命中我们要排除的场景:文件名最后四位是_min,紧接着就是扩展名的点号
  • \.:转义后的点号,匹配文件名与扩展名的分隔符
  • (jpg|gif):仅允许jpg或gif两种扩展名
  • $:匹配字符串结束位置,确保没有多余后缀

验证你的示例文件

我们逐个验证你给出的测试用例:

  • desc_125f.jpg → 匹配:文件名主体不以_min结尾,扩展名符合要求
  • desc#_56.jpg → 不匹配:包含#,不属于\w的匹配范围
  • bla_bla.gif → 匹配:完全符合规则
  • bla_bla.png → 不匹配:扩展名是png,不在允许范围内
  • desc_125f_min.jpg → 不匹配:文件名主体以_min结尾,被负后顾断言排除
  • desc_min256.gif → 匹配:文件名主体是desc_min256,结尾不是_min,符合规则

为什么你之前的正则失效?

你写的^\w+(?!_min)\.(jpg|gif)$用了正向负前瞻(?!_min),它的作用是:在\w+匹配结束的位置之后,紧接着的内容不是_min。但对于desc_125f_min.jpg,\w+会直接匹配整个desc_125f_min,此时后面跟着的是.jpg,不是_min,所以前瞻条件满足,导致错误匹配。

PHP代码示例

你可以这样在preg_match中使用这个正则:

$testFiles = [
    'desc_125f.jpg',
    'desc#_56.jpg',
    'bla_bla.gif',
    'bla_bla.png',
    'desc_125f_min.jpg',
    'desc_min256.gif'
];

foreach ($testFiles as $file) {
    if (preg_match('/^\w+(?<!_min)\.(jpg|gif)$/', $file)) {
        echo "✅ 匹配:{$file}\n";
    } else {
        echo "❌ 不匹配:{$file}\n";
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:22:51