【问题标题】:What regular expression should I use to find the file name that does not contain the specified string?我应该使用什么正则表达式来查找不包含指定字符串的文件名?
【发布时间】:2023-03-02 22:37:01
【问题描述】:

我正在尝试使用 preg_match 函数创建文件夹中的文件列表。但是,我想省略在文件名和扩展名之间包含“_min”字符串的文件。文件名只能由字母数字和下划线字符组成,扩展名只能是 jpg 和 gif。 例如:
desc_125f.jpg -> 匹配,
desc#_56.jpg -> 不匹配(包含#),
bla_bla.gif -> 匹配,
bla_bla.png -> 不匹配(扩展是 png),
desc_125f_min.jpg -> 不匹配(文件名和扩展名之间包含 _min),
desc_min256.gif -> 匹配(_min 不在文件名和扩展名之间扩展名)。
正则表达式模式应该如何?

我已经尝试过:^\w+(?!_min)\.(jpg|gif)$,但它没有像我预期的那样工作,因为 desc_125f_min.jpg 已经匹配。

【问题讨论】:

  • 请编辑您的问题并说明匹配文件名的完整规则。

标签: php regex preg-match filenames


【解决方案1】:

您的正则表达式的问题在于\w+ 吸收了直到. 的所有字符,因此_min 的负前瞻总是成功。您需要将负前瞻移动到正则表达式的开头:

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

Demo on regex101

【讨论】:

  • 我从没想过有必要将它移到正则表达式的开头。它完美地工作!非常感谢!
【解决方案2】:

问题在于,您在. 之前使用ahead 来查看您真正想要向后看的位置。

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

demo at regex101。为了减少回溯,请使用\w quantifier possessive

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 2010-09-12
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    相关资源
    最近更新 更多