请教一个正则表达式,要求如下: 要求输入中: 1, 只能是数字或* 2, 不能存在两个连着的* 3, 至少存在一组连着的三个数字 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 var regex = /^((?!\*\*)[\d\*])*?\d{3}((?!\*\*)[\d\*])*?$/;var str = ["111**11*11","11*11*111","1*1*1"];for(var i = 0 ; i < str.length ; i ++){ document.write(str[i]+"_____" +regex.test(str[i])+"</br>")}/*111**11*11_____false11*11*111_____true1*1*1_____false*/试试看,有没有bug我不知道 1楼的好像可以,不过楼主好像没说清楚,没有3个连续的数字,但又4个连续的算不算呢?借鉴1楼的代码,写出下面这个(必须要有3个连续的,只有4个的不算):var regex = /(?=^[\d*]*$)(?=^(?!.*\*\*))(?=.*([^\d]|^)\d{3}([^\d]|$))/; //ie bugvar str = ["111**22*33","11*22*333","1*2*3",'*111*22**','a*111*22*', '*1111*'];for(var i = 0 ; i < str.length ; i ++) { document.write(str[i]+"_____" +regex.test(str[i])+"<br>")}/*111**22*33_____false11*22*333_____true1*2*3_____false*111*22**_____falsea*111*22*_____false*1111*_____false*/不过在IE6/7里面好像杯具了,又跟标准有出入了吗?反正跟IE8和其它非IE浏览器不一样:/*111**22*33_____false11*22*333_____false1*2*3_____false*111*22**_____falsea*111*22*_____false*1111*_____false*/后来发现,改一个写法,IE貌似可以支持了:var regex = /(?!.*[^\d*])(?=^(?!.*\*\*))(?=.*([^\d]|^)\d{3}([^\d]|$))/;var str = ["111**22*33","11*22*333","1*2*3",'*111*22**','a*111*22*', '*1111*'];for(var i = 0 ; i < str.length ; i ++) { document.write(str[i]+"_____" +regex.test(str[i])+"<br>")}/*111**22*33_____false11*22*333_____true1*2*3_____false*111*22**_____falsea*111*22*_____false*1111*_____false*/另外我还测试过好多写法,不少结果都有些匪夷所思。比如那些看似不需要加的(?=),好像也会导致结果不同,即使是在那些规范的浏览器中。也可能是我测试的过程有疏漏吧。不过不管怎样,我现在也无法确定从规范的逻辑上讲,上面的正则是否100%正确。所以建议楼主:如果没有特殊要求的话,像这种复杂的情况还是分成多个简单的情况处理好了,比如分别用三个正则来依次处理。把问题分解开来,一来不用太费脑子,二来容易保证正确性,再就是跨浏览器兼容性问题也更容易绕开。 再补充一个简单有效又容易理解的,也兼容IE6/7的,貌似是100%正确的:var regex = /^\*?(\d+\*)*\d{3}(\*\d+)*\*?$/;var str = ["111**22*33","11*22*333","1*2*3",'*111*22**','a*111*22*', '*1111*', '111', '*111*', '1*111*', '**111*'];for(var i = 0 ; i < str.length ; i ++) { document.write(str[i]+"_____" +regex.test(str[i])+"<br>")}/*111**22*33_____false11*22*333_____true1*2*3_____false*111*22**_____falsea*111*22*_____false*1111*_____false111_____true*111*_____true1*111*_____true**111*_____false*/ JSON数据能在火狐上显示,但是IE8显示不出来 去掉大小写空格的正则表达式 页面切换的时候背景声音不会断 别跟我说要母版 有了解ext的htmleditor编辑器的吗? jQuery UI Tabs 基于 jQuery 的一个Tab选项卡导航,如何保存选项卡的选中状态 求助opener对象的问题,帮帮我 如何去掉用JS操作数据库时弹出的提示框?——急急急 问题两则:display和visibility的区别... 用什么样的方法可以在运行时向listbox中添加item 保留小数点后两位,然后将其转为大写 JQuery如何为XML对象添加节点 FireFox下怎么导出table到Excel
var str = ["111**11*11","11*11*111","1*1*1"];
for(var i = 0 ; i < str.length ; i ++)
{
document.write(str[i]+"_____" +regex.test(str[i])+"</br>")
}
/*
111**11*11_____false
11*11*111_____true
1*1*1_____false
*/试试看,有没有bug我不知道
var str = ["111**22*33","11*22*333","1*2*3",'*111*22**','a*111*22*', '*1111*'];
for(var i = 0 ; i < str.length ; i ++) {
document.write(str[i]+"_____" +regex.test(str[i])+"<br>")
}
/*
111**22*33_____false
11*22*333_____true
1*2*3_____false
*111*22**_____false
a*111*22*_____false
*1111*_____false
*/不过在IE6/7里面好像杯具了,又跟标准有出入了吗?反正跟IE8和其它非IE浏览器不一样:/*
111**22*33_____false
11*22*333_____false
1*2*3_____false
*111*22**_____false
a*111*22*_____false
*1111*_____false
*/后来发现,改一个写法,IE貌似可以支持了:var regex = /(?!.*[^\d*])(?=^(?!.*\*\*))(?=.*([^\d]|^)\d{3}([^\d]|$))/;
var str = ["111**22*33","11*22*333","1*2*3",'*111*22**','a*111*22*', '*1111*'];
for(var i = 0 ; i < str.length ; i ++) {
document.write(str[i]+"_____" +regex.test(str[i])+"<br>")
}
/*
111**22*33_____false
11*22*333_____true
1*2*3_____false
*111*22**_____false
a*111*22*_____false
*1111*_____false
*/另外我还测试过好多写法,不少结果都有些匪夷所思。
比如那些看似不需要加的(?=),好像也会导致结果不同,即使是在那些规范的浏览器中。
也可能是我测试的过程有疏漏吧。
不过不管怎样,我现在也无法确定从规范的逻辑上讲,上面的正则是否100%正确。所以建议楼主:如果没有特殊要求的话,像这种复杂的情况还是分成多个简单的情况处理好了,比如分别用三个正则来依次处理。
把问题分解开来,一来不用太费脑子,二来容易保证正确性,再就是跨浏览器兼容性问题也更容易绕开。
var str = ["111**22*33","11*22*333","1*2*3",'*111*22**','a*111*22*', '*1111*', '111', '*111*', '1*111*', '**111*'];
for(var i = 0 ; i < str.length ; i ++) {
document.write(str[i]+"_____" +regex.test(str[i])+"<br>")
}
/*
111**22*33_____false
11*22*333_____true
1*2*3_____false
*111*22**_____false
a*111*22*_____false
*1111*_____false
111_____true
*111*_____true
1*111*_____true
**111*_____false
*/