否定正则表达式查询

时间:2016-12-15 16:05:54

标签: regex amazon-s3 regex-negation regex-lookarounds

我已经看了很多关于这个的帖子,但我仍然遇到问题。

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

测试铲斗日志** - 我们 - 东 - 1 **

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

  1. 测试铲斗日志
  2. 测试桶日志-US-东-1
  3. 现在,我想做的是否定这个。所以我想抓住所有不遵循上述方案的桶。我已经成功地形成了一个匹配命名方案的查询,但是我遇到的问题是形成一个否定它的问题。正则表达式如下:

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

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

    1. 例如桶-日志-AP-东北-1
    2. 东西桶-日志-EU-中央-1
    3. 无效的存储桶名称(我们希望与之匹配):

      1. Iscrewedthepooch
      2. 测试桶日志-US-EE
      3. 斗日志-US-东-1
      4. 感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

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

但你可以试试这个:

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

这是使用负lookeahead(?!)的典型解决方案,该负lookeahead是非捕获组,具有零长度。基本上它表明你希望每一行以某些东西开头但后面没有模式。

<强> EDITED

正如易卜拉欣指出的那样(谢谢!),我的第一个正则表达式存在一些问题。我修好了,我觉得现在还可以。我忘了将内部正则表达式的最后一部分设置为可选(?)。