数字和字母混搭怎么区分

回忆安存 1个月前 已收到1个回答 举报

出口说不出 1星

共回答了123个问题采纳率:96.9% 评论

验证字符串包含数字简单,验证字符串包含字母也简单,验证字符串不包含其它字符也简单,可以用这三个正则分别检查一次字符串,逻辑运算出最终结果。

但是怎么能把这些功能写进一个正则表达式里呢?这个问题真有点伤脑筋。

下面是lexrus的正则:

 /^([a-z]+(?=[0-9])|[0-9]+(?=[a-z]))[a-z0-9]+$/ig 

思路非常的清晰啊:

[a-z]+(?=[0-9])

字母开头,后面必须紧跟着数字。

[0-9]+(?=[a-z]

数字开头,后面必须紧跟着字母。

[a-z0-9]+

后面的字符只要是数字或者字母就可以了。经过测试,发现不好使,123dd会被识别为不合法,dd123则为合法,可见“数字开头,紧跟字母”的正则没有起作用。测试代码如下:

 <script type="text/javascript">

 function istrue(str){

 var reg=/^([a-z]+(?=[0-9])|[0-9]+(?=[a-z]))[a-z0-9]+$/ig;

 return reg.test(str);

 }

 var str? = 'AaBc';

 var str2 = 'aaa123';

 var str3 = '123dd';

 var str4 = '1230923403982';

 document.write(istrue(str)+'<br />');

 document.write(istrue(str2)+'<br />');

 document.write(istrue(str3)+'<br />');

 document.write(istrue(str4)+'<br />');

 </script> 

结果为:

false,true,false,false

结果中的第三个,将'123dd'判断为非法是错误的。刚开始以为是g的问题,去掉了还是不好使。应该是浏览器bug,我认为lexrus的正则是正确的,可能是浏览器无法处理或”|”的两边都包含正向预查(?=)。

修改之后的正则如下:

 /^(([a-z]+[0-9]+)|([0-9]+[a-z]+))[a-z0-9]*$/i 

意思和上面差不多,但是没有使用正向预查,测试代码如下:

 <script type="text/javascript">

 function istrue(str){

 var reg=/^(([a-z]+[0-9]+)|([0-9]+[a-z]+))[a-z0-9]*$/i;

 return reg.test(str);

 }

 var str? = 'AaBc';

 var str2 = 'aaa123';

 var str3 = '123dd';

 var str4 = '1230923403982';

 document.write(istrue(str)+'<br />');

 document.write(istrue(str2)+'<br />');

 document.write(istrue(str3)+'<br />');

 document.write(istrue(str4)+'<br />');

 </script> 

结果为

false,true,true,false

正确。

1小时前

32
可能相似的问题

猜你喜欢的问题

热门问题推荐

Copyright © 2024 微短问答 All rights reserved. 粤ICP备2021119249号 站务邮箱 959505@qq.com