带有可选非重复点的字符串的正则表达式

时间:2014-02-20 15:42:37

标签: java regex

我需要在Java中验证字符串以满足以下要求:

  • 字符串长度必须为5-32个字符
  • 字符串可以包含
    • 字母(a-z),
    • 数字(0-9),
    • 破折号( - ),
    • 下划线(_),
    • 和句点(。)。
  • 字符串不得包含多个句点(。)。

这个正则表达式是否是正确的解决方案?

^(?!([^\\.]*+\\.){2,})[\\.a-z0-9_-]{5,32}$

3 个答案:

答案 0 :(得分:1)

您非常接近,您可以使用此正则表达式来阻止输入中的2个句点:

^(?!([^.]*\\.){2})[.a-z0-9_-]{5,32}$

如果要阻止2个连续点,请使用:

^(?!.*?\\.{2})[.a-z0-9_-]{5,32}$

答案 1 :(得分:1)

我喜欢正则表达式,但出于可读性和可维护性的原因,我认为应尽可能保持简单,这意味着将它们用于他们擅长的事情,并在适当的时候使用您的语言/环境的其他功能

在评论中,您说这是用于bean验证。您可以使用多个简单注释验证您的字段:

@Size(min=5,max=32)
@Pattern.List({
    @Pattern(regexp = "^[a-z0-9-_.]*$", 
             message = "Valid characters are a-z, 0-9, -, _, ."),
    @Pattern(regexp = "^((?!\.{2}).)*$", 
             message = "Must not contain a double period")
})
private String myField;

还要记住,您可以用Java编写自定义约束。

......当然在其他情况下同样适用:

boolean isValid(String s) {
    return s.length() >= 5 &&
           s.length() <= 32 &&
           s.matches("^[a-z0-9-_.]*$") &&
           !s.contains("..")
}

答案 2 :(得分:0)

这可能有效

 #   "^(?:[0-9a-z_-]|\\.(?!\\.)){5,32}$"  

 ^ 
 (?:
      [0-9a-z_-] 
   |  \.
      (?! \. )
 ){5,32}
 $