正则表达式使用单个字符集捕获相邻字符

时间:2017-08-03 14:23:54

标签: regex

我正在尝试构造一个匹配符合以下条件的字符串的正则表达式语句:

  1. 3-63个小写字母数字字符,加上"。"和" - "
  2. 可能无法开始或结束。或 -
  3. 破折号和句号不能相邻。
  4. abc-123.xyz< - 应匹配

    abc123-.xyz< - 不应该匹配

    我已经能够将这个正则表达式放在一起,但它没有达到第三个要求。我试图使用另一个负向前瞻/后视,[即。 - (?!.- | - 。)]但它仍然匹配相邻句点和短划线的字符串。这是我提出的正则表达式,符合条件1& 2:

    ^(?!\.|-)([a-z0-9]|\.|-){3,63}(?<!\.|-)$
    

    仅供参考,此正则表达式用于在CloudFormation模板中指定AWS S3存储桶名称时验证输入。

3 个答案:

答案 0 :(得分:0)

怎么样:

^(?=.{3,63}$)[a-z0-9]+(?:[-.][a-z0-9]+)*$

答案 1 :(得分:0)

^[a-z0-9](?:[a-z0-9]|[.\-](?=[a-z0-9])){2,62}$

我们匹配一个小写的字母数字字符,然后重复2到62次:

  • 小写字母数字字符或
  • .-(必须后跟小写的字母数字字符)。

最后一项限制可确保您不能连续两个. / -字符,或字符串末尾的. / -

答案 2 :(得分:0)

使用此模式^(?!.*[.-](?=[.-]))[^.-][a-z0-9.-]{1,61}[^.-]$ Demo

#    ^(?!.*[.-](?=[.-]))[^.-][a-z0-9.-]{1,61}[^.-]$
^               # Start of string/line
(?!             # Negative Look-Ahead
  .             # Any character except line break
  *             # (zero or more)(greedy)
  [.-]          # Character in [.-] Character Class
  (?=           # Look-Ahead
    [.-]        # Character in [.-] Character Class
  )             # End of Look-Ahead
)               # End of Negative Look-Ahead
[^.-]           # Character not in [.-] Character Class
[a-z0-9.-]      # Character in [a-z0-9.-] Character Class
{1,61}          # (repeated {1,61} times)
[^.-]           # Character not in [.-] Character Class
$                # End of string/line