我对 RegEx 比较陌生,但遇到了问题。我想正则表达式一个名字。我希望它最多 100 个字符,至少包含 2 个字母字符,并且允许使用字符“-”。
我只检查字母字符或字母字符和连字符没有问题,但我不想要一个可能是'---------'的名称。
我没有检查连字符的代码是
var nameRegExp = /^([a-z]){2,100}$/;
对代码的解释也很受欢迎。谢谢!
我对 RegEx 比较陌生,但遇到了问题。我想正则表达式一个名字。我希望它最多 100 个字符,至少包含 2 个字母字符,并且允许使用字符“-”。
我只检查字母字符或字母字符和连字符没有问题,但我不想要一个可能是'---------'的名称。
我没有检查连字符的代码是
var nameRegExp = /^([a-z]){2,100}$/;
对代码的解释也很受欢迎。谢谢!
我猜
/^(?=.*[a-z].*[a-z])[a-z-]{1,100}$/
前瞻部分 ( ^(?=.*[a-z].*[a-z])
) 检查是否至少有两个字母。这种模式(“字符串开头,后跟...”)是在正则表达式中表达附加条件的常用方法。
-
正如@Mike指出的那样,您可以通过添加否定断言来限制数量:
/^(?=.*[a-z].*[a-z])(?!(?:.*-){11,})[a-z-]{1,100}$/ // max 10 dashes
然而,编写一个匹配“好”字符串而不是试图禁止“坏”字符串的表达式可能更容易。例如,这个
/^[a-z]+(-[a-z]+)*$/
看起来像是“名称”的一个很好的近似值。它允许foo
and ,但不允许orfoo-bar-baz
之类的东西。----
foo----bar----
要限制您的数量,-
可以添加一个负前瞻,其中数量3
比您要允许的最大数量多一
/^(?!(?:[a-z]*-){3,})(?=-*[a-z]-*[a-z])[a-z-]{2,100}$/