正则表达式

Posted michael_yqs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式相关的知识,希望对你有一定的参考价值。

正则表达式一直都在用,大部分时候都只需要写很简单的正则表达式,遇到比较复杂的需求的时候就直接百度,然后拷进去,这个我确实是有点懒的,所以一直都在重复这个过程。终于不想再这样搜来搜去了,索性把自己遇到过的正则表达式和我觉得可能以后会用的到的正则表达式都做一下整理。

1、数字

 
/^-?[1-9]\\d*$/    匹配整数    
/^-?(([1-9]\\d*)|0)\\.\\d+$/      匹配浮点数    其他的非正非负整数活浮点数都只需再正则表达式结束之前加 |0 就可以了

2、字符串

 /^\\w+$/   匹配由数字、26个英文字母或者下划线组成的字符串
/^[a-z]+$/i  匹配由26个字母组成的字符串,i表示不区分大小写
/^[A-Za-z0-9]+$/  匹配由数字和26个英文字母组成的字符串 注意\\w包含下划线_ 

 3、电话号码
手机:/\\d11/
座机;/\\d3-\\d8|\\d4-\\d7|\\d4-\\d8/


 4、Email 

/\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*/  

5、扣扣

/[1-9][0-9]4,/   扣扣号码是从10000开始的

6、中文匹配

中文的正则表达式比较复杂

根据Unicode 5.0版编码,要准确的判断一个中文字符要包括:  
范围  含义  范围  含义  
2E80-2EFF   CJK 部首补充    2F00-2FDF   康熙字典部首  
3000-303F   CJK 符号和标点   31C0-31EF   CJK 笔画  
3200-32FF   封闭式 CJK 文字和月份   3300-33FF   CJK 兼容  
3400-4DBF   CJK 统一表意符号扩展 A  4DC0-4DFF   易经六十四卦符号  
4E00-9FBF   CJK 统一表意符号  F900-FAFF   CJK 兼容象形文字  
FE30-FE4F   CJK 兼容形式    FF00-FFEF   全角ASCII、全角标点  
因此,正确的匹配中文字符正则表达式为:  
var rcjk = /[\\u2E80-\\u2EFF\\u2F00-\\u2FDF\\u3000-\\u303F\\u31C0-\\u31EF\\u3200-\\u32FF\\u3300-\\u33FF\\u3400-\\u4DBF\\u4DC0-\\u4DFF\\u4E00-\\u9FBF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF]+/g;  

如果不希望匹配标点、符号,在正则中去掉对应的范围即可:  
3000-303F   CJK 符号和标点   FF00-FFEF   全角ASCII、全角标点  
(这个是抄的,原文地址:http://nuysoft.iteye.com/blog/1217898)

7、身份证

如果不严格的话,这样也是可以的:\\d15|\\d18  ,这只是在长度上进行了验证,但是严格的身份证号码,出生日期和校验位都是需要验证的,如果再严格一点的话,还要与实际的性别对应。

function checkProvince(card) 
    var province = card.substr(0, 2);
    var vcity = 
        11: "北京",
        12: "天津",
        13: "河北",
        14: "山西",
        15: "内蒙古",
        21: "辽宁",
        22: "吉林",
        23: "黑龙江",
        31: "上海",
        32: "江苏",
        33: "浙江",
        34: "安徽",
        35: "福建",
        36: "江西",
        37: "山东",
        41: "河南",
        42: "湖北",
        43: "湖南",
        44: "广东",
        45: "广西",
        46: "海南",
        50: "重庆",
        51: "四川",
        52: "贵州",
        53: "云南",
        54: "西藏",
        61: "陕西",
        62: "甘肃",
        63: "青海",
        64: "宁夏",
        65: "新疆",
        71: "台湾",
        81: "香港",
        82: "澳门",
        91: "国外"
    ;

    if (vcity[province] === undefined) 
        return false;
    
    return true;


//检查生日是否正确  
function checkBirthday(card) 
    //身份证15位时,次序为省(2位)市(2位)区(2位)年(2位)月(2位)日(2位)校验位(3位),皆为数字  
    card = changeFivteenToEighteen(card);
    var len = card.length;
    //身份证18位时,次序为省(2位)市(2位)区(2位)年(4位)月(2位)日(2位)顺序位(3位)校验位(1位),校验位可能为X
    var re_eighteen = /^(\\d6)(\\d4)(\\d2)(\\d2)(\\d3)([0-9]|X)$/;
    var arr_data2 = card.match(re_eighteen);
    var year2 = arr_data2[2];
    var month2 = arr_data2[3];
    var day2 = arr_data2[4];
    var birthday2 = new Date(year2 + '/' + month2 + '/' + day2);
    return verifyBirthday(year2, month2, day2, birthday2);

//校验日期
function verifyBirthday(year, month, day, birthday) 
    var now = new Date();
    var now_year = now.getFullYear();
    //年月日是否合理
    if (birthday.getFullYear() === year && (birthday.getMonth() + 1) === month && birthday.getDate() === day) 
        //判断年份的范围(3岁到100岁之间)
        var time = now_year - year;
        if (time >= 3 && time <= 100) 
            return true;
        
        return false;
    
    return false;


function changeFivteenToEighteen(card) 
    if (card.length === '15') 
        var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
        var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
        var cardTemp = 0,
            i;
        card = card.substr(0, 6) + '19' + card.substr(6, card.length - 6);
        for (i = 0; i < 17; i++) 
            cardTemp += card.substr(i, 1) * arrInt[i];
        
        card += arrCh[cardTemp % 11];
        return card;
    
    return card;



8、军官证(当时也是查了些资料才搞出来的,军官证这玩意儿哪有多少人见过啊)

 /[\\u4e00-\\u9fa5](字第)1(\\d4,8)(号?)$/
9、首尾空格

/^\\s+|\\s+$/  

最后题外话,这篇文章里面的正则表达式写的还是不错的,很是够用,虽然有点啰嗦: http://nuysoft.iteye.com/blog/1217898



 

以上是关于正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

正则匹配方法

正则匹配的中文包括中文标点符号吗?

正则匹配的中文包括中文标点符号吗?

正则表达式匹配带有标点的单词,但不是单独的标点

正则表达式 最近在做文本清洗,遇到(,,!或者?!!,),想要清除第一个逗号后面的所有多余标点符号

正则表达式标点分割[Python]