特选类型
后四位数字是否是AAAB AABB ABAB AAAA ABBB ABCD 的类型
使用js验证手机号码后四位是否是上述所描述的类型 这个我最初想到的使用正则,难道要对每一种都写一个正则吗?还是有其他的处理方式?欢迎大家指点?正则不太会。如果可以用正则的话也行,顺便也学习下正则,个人感觉写正则更加是思路的产物,需要学习。。
PHP中文网2017-04-10 15:40:23
重新回答下,感谢 @Honwhy 指出问题。
判断ABCD的方法:
var isABCD = function(str){
return !!new RegExp('('+str+')').exec('0123456789');
}
伊谢尔伦2017-04-10 15:40:23
// 手机号码正则待补充,或者在SF其他问题中可以到相关答案
// 取出最后四位数字后
/**
* @param str 4 digit
*/
function isMatch(str) {
var arr = [];
str.split('').forEach(function(item) {
if(arr.indexOf(item) == -1) {
arr.push(item);
}
});
if(arr.length == 1 || arr.length == 2 || arr.length == 4) {
return true;
}
return false;
}
isMatch("1112"); // true
isMatch("1123"); // false
isMatch("1122"); // true
isMatch("1233"); // false
isMatch("1222"); // true
isMatch("1234"); // true
ringa_lee2017-04-10 15:40:23
javascript
function isAdjacent(a, b){ return a.charCodeAt()+1 === b.charCodeAt(); } function isSpecail(mobile){ var tailNum; if (mobile.length != 11){ return false; } tailNum = mobile.slice(-4); if (tailNum.slice(0,3) === tailNum.slice(-1) && "AB".indexOf(tailNum[0]) >= 0){ // AAAA or BBBB mode return true; }else if (tailNum.slice(0,2) === tailNum.slice(-2) && "A".indexOf(tailNum[0]) >= 0){ if(tailNum[0] === tailNum[1] && isAdjacent(tailNum[1], tailNum[2])) { // AABB mode return true; }else if (isAdjacent(tailNum[0], tailNum[1])){ // ABAB mode return true; } }else if ((tailNum.slice(0,2) === tailNum.slice(1,3) || tailNum.slice(-2) === tailNum.slice(1,3)) && (isAdjacent(tailNum[0], tailNum[1]) || isAdjacent(tailNum[2], tailNum[3])) && "B".indexOf(tailNum[3]) >= 0){ // AAAB or ABBB mode return true; }else if (isAdjacent(tailNum[0], tailNum[1]) && isAdjacent(tailNum[1], tailNum[2]) && isAdjacent(tailNum[2], tailNum[3]) && "A".indexOf(tailNum[0]) >= 0){ return true; } return false; }
使用indexOf的地方支持扩展。例如: 四个全等的可将"AB" 改成 '0123456789'
PHP中文网2017-04-10 15:40:23
经过今天一天正则表达式的简单学习(主要是根据自己的需求有选择的进行的临时学习),最后我自己的解决方案如下:
function checkNum(mobile)
{
var typeNum = new Array("0123","1234","2345","3456","4567","5678","6789");
var result = typeNum.indexOf(mobile);
return (result>=0)?true:false;
}
function check(mobile)
{
var reMobile1 = /^(?=\d{4}$)(\d)\1(\d)\2/;//匹配AABB AAAA类型
var reMobile2 = /^(?=\d{4}$)(\d)(\d)\1\2/;//匹配ABAB
var reMobile3 = /^(?=\d{4}$)(\d)\1{2}/;//匹配AAAB
var reMobile4 = /^(?=\d{4}$)(\d)(\d)\2{2}/;//匹配ABBB
if (reMobile1.test(mobile) || reMobile2.test(mobile) || reMobile3.test(mobile) || reMobile4.test(mobile) || checkNum(mobile)){
return false;
}else{
return true;
}
}
check("1234");//自行测试
ABCD这个特殊类型没有通过正则写出来,还在研究中,研究出来再和大家共享。js正则表达式语法
大家有不太懂得可以参考上面的,我基本上就是参考的上面的内容。有什么不懂得 也可以提出大家一起讨论学习下。
PHP中文网2017-04-10 15:40:23
看楼主已经用正则搞出了除ABCD类型外其他情况的正则匹配,我补充一下判断ABCD型特选号码的方法,经测试是OK的。
function isABCD(str){
var num,arr=[],onestep=0;
for(var i=1;i<=4;i++){
var num=parseInt(str.substr(str.length-i,1),0);
if(!isNaN(num) && arr.length>=i-2 && arr[i-2]-num==1){
onestep++;
}
arr.push(parseInt(num));
}
return onestep<3?false:true;
}
console.log(isABCD("1234")); //true
console.log(isABCD("1235")); //false
console.log(isABCD("0123")); //true
console.log(isABCD("4567")); //true
console.log(isABCD("5678")); //true
console.log(isABCD("0234")); //false
console.log(isABCD("13125636789")); //true
console.log(isABCD("13625636879")); //false
高洛峰2017-04-10 15:40:23
自己改改正则
js
/** * * @descrition:判断输入的参数是否是个合格的手机号码,不能判断号码的有效性,有效性可以通过运营商确定。 * @param:str ->待判断的手机号码 * @return: true表示合格输入参数 * */ var isCellphone = function(str) { /** *@descrition:手机号码段规则 * 13段:130、131、132、133、134、135、136、137、138、139 * 14段:145、147 * 15段:150、151、152、153、155、156、157、158、159 * 17段:170、176、177、178 * 18段:180、181、182、183、184、185、186、187、188、189 * */ var pattern = /^(13[0-9]|14[57]|15[012356789]|17[0678]|18[0-9])\d{8}$/; return pattern.test(str); } /** * @descrition:判断输入的参数是否是个合格的固定电话号码。 * @param:str->待验证的固定电话号码。 * @return : true表示验证合格。 * **/ var isfixedphone = function(str) { /** * @desctition:规则->区号3-4位,号码7-8位,可以有分机号,分机号为3-4为,格式如下:"0775-85333333-123" */ var pattern = /^\d{3,4}-\d{7,8}(-\d{3,4})?$/; return pattern.test(str); }