否定正则表达式查询

Negating a regex query

我查看了多篇关于此的帖子,但仍有问题。

我正在尝试编写一个正则表达式查询来查找 遵循我们想要的命名方案的 S3 存储桶的名称。我们想要的方案如下:

测试桶日志**-us-east-1**

粗体部分是可选。意思是,以下两个是有效的存储桶名称:

  1. 测试桶日志
  2. 测试桶日志-us-east-1

现在,我要做的是否定这个。所以我想捕获所有不遵循上述方案的桶。我已经成功地形成了一个匹配命名方案的查询,但是在形成一个否定它的查询时遇到了问题。正则表达式如下:

^(.*-bucket-logs)(-[a-z]{2}-[a-z]{4,}-\d)?$

所以一些更有效的存储桶名称:

  1. example-bucket-logs-ap-northeast-1
  2. something-bucket-logs-eu-central-1

无效的存储桶名称(我们要匹配这些):

  1. 搞砸了狗
  2. test-bucket-logs-us-ee
  3. bucket-logs-us-east-1

感谢您的帮助。

正如 Barmar 先生所说,在这些情况下最好的方法可能是以编程方式解决它。您可以编写通常的正则表达式来匹配正确的模式,并将它们从集合中排除。

不过你可以试试这个:

^(?:.(?!-bucket-logs-[a-z]{2}-[a-z]{4,}-\d|-bucket-logs$))*$

这是一个典型的解决方案,它使用了一个非捕获组,长度为零的负先行(?!)。基本上它表示您希望每一行都以某物开头但后面没有模式。

已编辑

正如 Ibrahim 所指出的(谢谢!),我的第一个正则表达式存在一个小问题。我修复了它,我认为现在可以了。我忘了将内部正则表达式的最后一部分设置为可选(?)。