2

我为密码字段的表单验证创建了这个正则表达式

"/^[[A-Za-z0-9]+[A-Za-z0-9, .!@#$%^&*()_]*]{3,25}$/",

它接受所有字母数字字符和特殊字符,但仅特殊字符是不可接受的。

问题在于长度检查:(

它应该如下所示

Valid: aaaaaaaaa 
Valid: 111111111
Valid: 11111n11111
Valid: nnnn1jkhuig
InValid: @@@@@@@@

但它正在引发错误

aaaaaaaaaaaa

以及

4

4 回答 4

4
^(?=.*[A-Za-z0-9])[A-Za-z0-9, .!@#$%^&*()_]{6,25}$

用 PHP 测试)。说明:

  • 字符串应匹配[A-Za-z0-9, .!@#$%^&*()_]6 到 25 个字符
  • 字符串中的某处[A-Za-z0-9]必须存在(确保字符串不是由特殊字符组成)。
于 2011-09-12T11:23:59.510 回答
3

您可以使用零宽度肯定断言来解决此问题。这是正则表达式,我将在下面解构它。

/(?=.*[A-Za-z0-9])[A-Za-z0-9, .!@#$%^&*()_]{3,25}/

第一个组件是(?=.*[A-Za-z0-9])。该构造(?=...)是一个零宽度断言,这意味着它会检查某些内容,但不会“吃掉”任何输出。如果“...”部分匹配,则断言通过并且正则表达式继续。如果不匹配,则断言失败,正则表达式返回不匹配。在这种情况下,我们的“...”是“.*[A-Za-z0-9]”,它只是说“检查是否存在某个字母数字字符,我们不在乎在哪里”。

下一个组件是[A-Za-z0-9, .!@#$%^&*()_]{3,25}并且只是说匹配任何有效字符中的 3 到 25 个字符。我们已经知道其中至少有一个是字母数字的,因为我们的肯定前瞻断言,所以这已经足够好了。

于 2011-09-12T11:24:54.737 回答
1

你不能嵌套字符类,但我认为你的意思是

/^([A-Za-z0-9]+[A-Za-z0-9, .!@#$%^&*()_]*){3,25}$/

但这也行不通,因为量词{3,25}也不能嵌套。

试试这个

^(?=.{3,25})[A-Za-z0-9]+[A-Za-z0-9, .!@#$%^&*()_]*$

(?=.{3,25})是一个前瞻,只是确保您的长度要求。

于 2011-09-12T11:23:26.253 回答
0

我认为您的正则表达式有点奇怪,您将一个集合包含在一个集合中。

应该/^([A-Za-z0-9]+[A-Za-z0-9, .!@#$%^&*()_]*){3,25}$/用括号来定义数字。

于 2011-09-12T11:18:59.957 回答