jQuery源码学习笔记(2)

正则篇

一、参考资料来源:

正则工具:https://www.debuggex.com/

正则教程:http://www.cnblogs.com/China3S/archive/2013/11/30/3451971.html

《常用正则表达式》

二、正则方法汇总:

^\s+|\s+$,//去掉首尾空格

^[A-Za-z]+$,//匹配不区分大小写的英文字母组成的字符串,也可以写成:^[a-z]+$/i

^[a-z]+$,//匹配小写英文字母字符串,大写:^[A-Z]+$

^[a-zA-Z-0-9]+$,//匹配由数字与英文字母组成的字符串

^\w+$,//匹配由英文字母、数字或者下划线组成的字符串

^[\u4e00-\u9fa5a-zA-Z0-9\s]+$,//中文、英文、数字和空格

^[1-9]\d*$,//匹配正整数,\d* 表示0-9位中任意一位或多位数字,*号表示匹配前面元字符0次或多次

^-[1-9]\d*$,//匹配负整数

^-?[1-9]\d*$,//匹配整数

^[1-9]\d*|0$,//匹配非负整数

^-[1-9]\d*|0$,//匹配非正整数

^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$,//匹配正浮点数

^-([1-9]\d*\.d*|0\.\d*[1-9]\d*)$,//匹配负浮点数

^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$,//匹配浮点数

中文字符正则

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;

解析说明:

普遍使用的正则是[\u4e00-\u9fa5],但这个范围并不完整。例如:

/[\u4e00-\u9fa5]/.test( '⻏' ) // 测试部首⻏,返回false

根据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、全角标点

HTML标记正则

var rtag = /^<([a-z]+)\s*\/?> (?:<\/\1>)?$/i, //去掉了中间的.* ,应用范围仅限于简单的标签匹配、提取,不能匹配嵌套标记。

邮箱正则

var remail = /^([\w-_]+(?:\.[\w-_]+)*)@((?:[a-z0-9]+(?:-[a-zA-Z0-9]+)*)+\.[a-z]{2,6})$/i;

URL正则

var reg=/(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/, //不完善

用户名或帐号正则:\w{4,16}

国内电话号码正则:[1-9][0-9]{4,}

中国邮政编码正则:[1-9]\d{5}(?!\d)

身份证正则

简单版:\d{15}|\d{18}

复杂版:

function parseID(ID) {

if ( ID.length == 15 ) {

// 升级为18位

ID = ID.substr( 0, 6 ) + "19" + ID.substr( 6 );

// 前17位对应的系数

var rank = [

"7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5", "8", "4", "2"

];

// 前17为加权除以17后的余数对应的最后一位身份证号码

var last = [

"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"

];

// 加权和

for ( var i = 0, sum = 0, len = ID.length; i < len; i++)

sum += ID[ i ] * rank[ i ];

// 加上最后一位

ID += last[ sum % 11 ];

}

if ( ID.length != 18 ) return null;

var match = rid.exec( ID );

return match ? {

ID : ID,

area : match[ 1 ],

y : match[ 2 ],

m : match[ 3 ],

d : match[ 4 ],

sex : match[ 5 ] % 2

} : null;

}

IP地址正则

var rip = /^(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])$/;

进一步增加分组:

var rip2 = /^([01]?\d{1,2}|2[0-4]\d|25[0-5])\.([01]?\d{1,2}|2[0-4]\d|25[0-5])\.([01]?\d{1,2}|2[0-4]\d|25[0-5])\.([01]?\d{1,2}|2[0-4]\d|25[0-5])$/;

去掉首尾空格正则(优化)

var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; //说明:\s空格 \uFEFF unicode编码空格 \xA0

=> (test + '').replace(rtrim, '');

(test + '')字符串去掉首尾空格

你可能感兴趣的