【问题标题】:All files ending with a suffix without using negation所有以后缀结尾但不使用否定的文件
【发布时间】:2012-08-28 11:29:17
【问题描述】:

我正在尝试匹配除以 .bmp 结尾的所有文件。

由于某些限制,我不能使用否定 (?:, !:) 和引用 (\1, ...)。

我已经做了一个表达式,它适用于大多数字符串:

^\w+\.([^b].*|b|b[^m].*|bm|bm[^p].*|bmp.+)$

它匹配不以 .bmp 结尾的所有内容 - 包括 test.txt、test.bmp.txt 等。 但不幸的是,它确实允许 test.bi.bmp。

知道如何改进正则表达式,使其只匹配以 .bmp 结尾的文件吗?

【问题讨论】:

  • 出于好奇,这些限制是什么?
  • 还有其他应用程序在目标机器上使用正则表达式引擎,并且由于某些原因(我不完全了解,但我想这可能与性能、与某些东西的兼容性或速度有关) 正则表达式引擎是在没有它的情况下专门编译的... :-(

标签: regex regex-negation


【解决方案1】:

为什么不:

^.*[^p]$|^.*[^m]p$|^.*[^b]mp$|^.*[^.]bmp$

?

http://regexr.com?31vg7

alternative^.*([^p]|[^m]p|[^b]mp|[^.]bmp)$(更短)。

【讨论】:

  • 谢谢,它运行良好(而且比我写的更优雅)。虽然最后一个错误的文件名确实通过了表达式:test..bmp
  • @Daniel:当文本位于最后一个输入行并且后面跟着一个空行时,正则表达式中存在一个带有该正则表达式的错误。我不知道为什么。在该行之后打开一个新行并输入其他任何内容,然后查看。
  • 谢谢。它完全解决了我的问题,我从你的回答中学到了很多东西!
【解决方案2】:
/^.+\.([^b][^.]*|b|b[^m][^.]*|bm|bm[^p][^.]*|bmp[^.]+)$/

只要确保 'bmp' 之前的点是最后一个点

【讨论】:

  • 不 [^.] 只是否定一切吗?
  • @Daniel:不,正则表达式元字符在字符类中失去了它们的特殊含义。
  • 我以为它只适用于 ()... 很高兴知道!谢谢。最后一个问题 - test..bmp 确实通过了。
【解决方案3】:

不太优雅但很有效:

^.*([^b][^m][^p]|b[^m][^p]|[^b]m[^p]|[^b][^m]p|bm[^p]|[^b]mp)$

【讨论】:

  • 您还假设扩展名始终为 3 个字母。
  • 我没有,我只是假设 .bmp 是 3 个字母长。超过 3 个字符的扩展名也会被匹配。
  • @Dmitry:例如 test.notabmp?这应该与您的正则表达式匹配,但我认为不是。
  • test.bsp 也不匹配...也许 b[^m]p 应该添加到 OR 子句中?
  • 而且它仍然匹配任何东西。bmp...我认为这是因为 * 是贪婪的
猜你喜欢
  • 2017-01-27
  • 2014-01-27
  • 2021-09-12
  • 1970-01-01
  • 2020-11-24
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
  • 2014-04-19
相关资源
最近更新 更多