2017-08-03 14 views
0

我试图构建匹配的字符串,符合以下条件的正则表达式语句:“”正则表达式醒目相邻字符为一个字符集

  1. 3-63小写字母数字字符,再加上和“ - ”
  2. 可能无法开始或结束。或 -
  3. 虚线和周期不能相邻。

abc-123.xyz < - 应符合

abc123-.xyz < - 不应该匹配

我已经能够把这个正则表达式在一起,但它并没有赶上第三个要求。我尝试过使用另一个负面的前瞻/后视,即[ - (?!.- | - 。)]但它仍然将字符串与相邻的句点和破折号相匹配。这是我想出了正则表达式语句满足条件1 & 2:

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

仅供参考,这个表达式是在CloudFormation模板specifiying的AWS S3存储桶名称时,验证输入。

+1

是'.'和'-'计入'3,63'字符限制?试试'^(?= [a-z0-9 .-] {3,63} $)[a-z0-9] +(?:[ - 。] [a-z0-9] +)* $' –

+0

这个怎么样? '^(?:[a-zA-Z0-9] | - (?![。])| \。(?![ - ])){3,63} $' – Gurman

回答

0

如何:

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

['^(?=。 {3,63} $)[a-z0-9] +(?:[ - 。]?[a-z0-9] +)* $'是不好的模式](https://regex101.com/r/QNk8IB/1)。见[这里为什么](https://stackoverflow.com/questions/45463148/fixing-catastrophic-backtracking-in-regular-expression/45477009#45477009)。 –

+1

@WiktorStribiżew:感谢您的信息。 – Toto

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

我们匹配一个小写字母数字字符,然后重复2和62之间的任何一种:

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

最后的限制可以确保您不能连续两次./-字符或字符串的结尾./-

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