2017-06-04 83 views
-2

我的目的是查找一个函数,用于检查字符串是否以小写字母开头,以小写字母结尾,可能只包含一个或没有连字符-,并且小于或等于32个字符。javascript正则表达式在某些规则下匹配字符串?

以下是我的代码:

var ss = /^[a-z]+([A-Za-z0-9_]|(-?)|[a-z]+$){1,31}/; 
 
str="ss-fjdkkldjkskjdskjdksjdkjdkjklskssdkdkffdkdfkdfk"; 
 
ss.test(str);

测试字符串 结果与真实 aJDS-A a234bds aHJH878sjkJSK-JA

我的函数目前返回true并没有按”不符合我的要求。 如果测试字符串符合注册要求,结果应该返回true。 我不知道为什么。

+1

您发布的测试字符串以小写字母开头,以小写字母结尾,中间有一个。你为什么期望返回错误? – Paul

+1

为什么它应该返回false?它符合条件 – hjpotter92

+0

,因为它不符合要求 –

回答

1

请注意,JS正则表达式中的[A-Za-z0-9_]等于\w。因此,这里有几种解决方案,您的问题:

  • 整个字符串的长度被检查或者与代码(str.length > 0 && str.length <= 32)或使用(?=.{1,32}$)正向前查找后^启动的串锚在下面
  • 正则表达式的建议
  • 如果您需要时,它包含了一个-某处里面只匹配字符串,请使用一个可选的非捕获组这样的 - ^[a-z]\w*(?:-\w*[a-z])?$(=>^(?=.{1,31}$)[a-z]\w*(?:-\w*[a-z])?$
  • 如果连字符是可选的,加?量词后: ^[a-z]\w*(?:-?\w*[a-z])?$(=>^(?=.{1,31}$)[a-z]\w*(?:-?\w*[a-z])?$
  • 如果你只需要匹配一个字符串,当它包含任何数量的-里面的某个地方,请使用^[a-z](?:[-\w]*[a-z])?$(=>^(?=.{1,31}$)[a-z](?:[-\w]*[a-z])?$)。