如何编写正则表达式筛选合法且文件名与扩展名间不含_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
相关产品推荐
相关产品推荐

