Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
最小4个数字和最小1个字符的RegExp_Regex - Fatal编程技术网

最小4个数字和最小1个字符的RegExp

最小4个数字和最小1个字符的RegExp,regex,Regex,我试图测试一个输入是否至少有4个数字和1个字符。我有这个功能,但只有当字符的顺序是0000a时,我才希望它匹配,无论顺序是什么,所以00a00,a000,aa00a00a都会匹配模式 [0-9]{4,}[a-zA-Z]{1,} 我需要改变什么?我尝试了[a-zA-Z0-9]{5,},但是像aaaaaa和00012这样的东西匹配了,这是不好的。使用前瞻断言: (?=.*[a-zA-Z])(.*?\d){4,} 如果正式规则是: "Numbers >= 4 AND characters

我试图测试一个输入是否至少有4个数字和1个字符。我有这个功能,但只有当字符的顺序是
0000a
时,我才希望它匹配,无论顺序是什么,所以
00a00
a000
aa00a00a
都会匹配模式

[0-9]{4,}[a-zA-Z]{1,}

我需要改变什么?我尝试了
[a-zA-Z0-9]{5,}
,但是像
aaaaaa
00012
这样的东西匹配了,这是不好的。

使用前瞻断言:

(?=.*[a-zA-Z])(.*?\d){4,}


如果正式规则是:

"Numbers >= 4 AND characters == 1"
你将无法使用正则表达式,因为角色可能无处不在。在这种情况下,您需要某种下推自动机或带有计数器的算法

如果规则是
“数字==4,字符==1”
以下内容(不容易阅读)可能有效:

([a-zA-Z][0-9]{4,})|([0-9][a-zA-Z][0-9]{3,})|([0-9]{2,}[a-zA-Z][0-9]{2,})|([0-9]{3,}[a-zA-Z][0-9])|([0-9]{4,}[a-zA-Z])
([a-zA-Z]([a-zA-Z]|[0-9]){4,})|(([a-zA-Z]|[0-9])[a-zA-Z]([a-zA-Z]|[0-9]){3,})|(([a-zA-Z]|[0-9]){2,}[a-zA-Z]([a-zA-Z]|[0-9]){2,})|(([a-zA-Z]|[0-9]){3,}[a-zA-Z]([a-zA-Z]|[0-9]))|(([a-zA-Z]|[0-9]){4,}[a-zA-Z])
如果规则是 “(数字+字符)>=4和字符>=1”这可能适用于:

([a-zA-Z][0-9]{4,})|([0-9][a-zA-Z][0-9]{3,})|([0-9]{2,}[a-zA-Z][0-9]{2,})|([0-9]{3,}[a-zA-Z][0-9])|([0-9]{4,}[a-zA-Z])
([a-zA-Z]([a-zA-Z]|[0-9]){4,})|(([a-zA-Z]|[0-9])[a-zA-Z]([a-zA-Z]|[0-9]){3,})|(([a-zA-Z]|[0-9]){2,}[a-zA-Z]([a-zA-Z]|[0-9]){2,})|(([a-zA-Z]|[0-9]){3,}[a-zA-Z]([a-zA-Z]|[0-9]))|(([a-zA-Z]|[0-9]){4,}[a-zA-Z])

但由于机器人解决方案相当丑陋,我建议不要使用它们。实现一个小的算法会更容易和更易读。

你看过这些问题了吗:,或者?谢谢你的链接,我得到了这个似乎有效的
^(?=.[0-9]{4,})(?=.[a-zA-Z]+)([a-zA-Z0-9]+)$
,我会仔细阅读,看看积极的前瞻实际上是做什么的。积极的前瞻通常是一种非常简单的方法,可以将这些条件(可能有很多)添加到单个正则表达式中。你的
^(?=.[0-9]{4,})(?=.[a-zA-Z]+([a-zA-Z0-9]+)$
尝试与
4a444
不匹配,但是,你可以用
^(?=(?:..\d){4}(?=.[a-zA-Z])[a-zA Z0-9]+$
)或使用@falsetru的简短答案来解决这个问题。@Robin:对不起,读错了。另请看我对类似问题的回答。像这样的问题经常被问到。在Debuggex上,它工作得很好,但在我的代码中,它似乎每次都失败,我使用它就像
var regex=new RegExp('(?=.[a-zA-Z])(.'?\d){4,}'),然后我使用
regex.test(myStringVarHere)我做错了什么吗?@TomHart,使用正则表达式文字:
var regex=/(?=.[a-zA-Z])(.?\d){4,}/
@TomHart,因为
'\d'=='d'
;它匹配的是字母
d
,而不是数字(
\d
)。如果要使用字符串文字形式,则应转义反斜杠。是,+1。但是,使用更精确的表达式(如:
^(?=[^a-zA-Z]*[a-zA-Z])(\D*\D){4,}
)通常比使用无处不在(通常不必要)的点星更有效。我还添加了一个字符串锚的开始,以使不匹配的情况更加有效。