否定正则表达式查询
Negating a regex query
我查看了多篇关于此的帖子,但仍有问题。
我正在尝试编写一个正则表达式查询来查找 不 遵循我们想要的命名方案的 S3 存储桶的名称。我们想要的方案如下:
测试桶日志**-us-east-1**
粗体部分是可选。意思是,以下两个是有效的存储桶名称:
- 测试桶日志
- 测试桶日志-us-east-1
现在,我要做的是否定这个。所以我想捕获所有不遵循上述方案的桶。我已经成功地形成了一个匹配命名方案的查询,但是在形成一个否定它的查询时遇到了问题。正则表达式如下:
^(.*-bucket-logs)(-[a-z]{2}-[a-z]{4,}-\d)?$
所以一些更有效的存储桶名称:
- example-bucket-logs-ap-northeast-1
- something-bucket-logs-eu-central-1
无效的存储桶名称(我们要匹配这些):
- 搞砸了狗
- test-bucket-logs-us-ee
- bucket-logs-us-east-1
感谢您的帮助。
正如 Barmar 先生所说,在这些情况下最好的方法可能是以编程方式解决它。您可以编写通常的正则表达式来匹配正确的模式,并将它们从集合中排除。
不过你可以试试这个:
^(?:.(?!-bucket-logs-[a-z]{2}-[a-z]{4,}-\d|-bucket-logs$))*$
这是一个典型的解决方案,它使用了一个非捕获组,长度为零的负先行(?!)。基本上它表示您希望每一行都以某物开头但后面没有模式。
已编辑
正如 Ibrahim 所指出的(谢谢!),我的第一个正则表达式存在一个小问题。我修复了它,我认为现在可以了。我忘了将内部正则表达式的最后一部分设置为可选(?)。
我查看了多篇关于此的帖子,但仍有问题。
我正在尝试编写一个正则表达式查询来查找 不 遵循我们想要的命名方案的 S3 存储桶的名称。我们想要的方案如下:
测试桶日志**-us-east-1**
粗体部分是可选。意思是,以下两个是有效的存储桶名称:
- 测试桶日志
- 测试桶日志-us-east-1
现在,我要做的是否定这个。所以我想捕获所有不遵循上述方案的桶。我已经成功地形成了一个匹配命名方案的查询,但是在形成一个否定它的查询时遇到了问题。正则表达式如下:
^(.*-bucket-logs)(-[a-z]{2}-[a-z]{4,}-\d)?$
所以一些更有效的存储桶名称:
- example-bucket-logs-ap-northeast-1
- something-bucket-logs-eu-central-1
无效的存储桶名称(我们要匹配这些):
- 搞砸了狗
- test-bucket-logs-us-ee
- bucket-logs-us-east-1
感谢您的帮助。
正如 Barmar 先生所说,在这些情况下最好的方法可能是以编程方式解决它。您可以编写通常的正则表达式来匹配正确的模式,并将它们从集合中排除。
不过你可以试试这个:
^(?:.(?!-bucket-logs-[a-z]{2}-[a-z]{4,}-\d|-bucket-logs$))*$
这是一个典型的解决方案,它使用了一个非捕获组,长度为零的负先行(?!)。基本上它表示您希望每一行都以某物开头但后面没有模式。
已编辑
正如 Ibrahim 所指出的(谢谢!),我的第一个正则表达式存在一个小问题。我修复了它,我认为现在可以了。我忘了将内部正则表达式的最后一部分设置为可选(?)。