任何人都可以告诉我哪个是最佳解决方案?
我试图获得5到10个字符,至少一个字母,没有特殊字符,\ w中的字符是可以接受的。
,第二个检查最小长度为5但未验证最大长度。为什么呢?
^(?=.{5,10}$)(\w*[a-z]\w*)$
^(\w*[a-z]\w*){5,10}$
谢谢, VIJI
答案 0 :(得分:2)
因为在第二个中,整个组(\w*[a-z]\w*)
被允许重复5到10次。
在该群组中,您可以使用任意数量的\w
个字符。
您可能想要使用的是
^(?=.*?[a-z])\w{5,10}$
但你的第一个表达也很好。我认为没有前瞻性的解决方案是不容易的。
答案 1 :(得分:2)
在对Bergi(正确)答案的评论中,您要求一种方法来匹配您的字符串而不需要前瞻。
这是一个。这是一个简洁的正则表达式技巧,但它不会使正则表达式比使用前瞻时更简单。
^(?:([a-z])|[_0-9]){5,10}(?(1)|^)$
这将适用于支持条件的正则表达式,例如.NET,PCRE,Python和Ruby。
它是如何运作的?
(?:([a-z])|[_0-9])
只匹配一个字符。要指定字符,我们使用替换|
。如果字符是字母,则([a-z])
中的括号将其捕获到第1组。{5,10}
量词确保我们匹配正确数量的字符(?(1)|^)
是一个条件,用于检查是否已设置捕获Group1。如果已设置(|
的左侧),则不执行任何操作。如果尚未设置组1(|
的右侧),则表示我们没有匹配单个字母,并且字符串断言的^
开头强制正则表达式失败。