(建议先看看书:http://book.csdn.net/bookfiles/226/10022610673.shtml)
正则表达式(Regular Expression)是一个描述字符模式的对象,在JavaScript中使用RegExp类表示正则表达式,String和RegExp都定义了使用正则表达式进行强大的模式匹配和文本检索与替换的函数。
正则表达式使用直接量的表示方法为:
/expression/
使用RegExp构造函数为:
语法1: var reg = /pattern/[flags]
语法2: var reg = new RegExp("pattern",["flags"])
参数说明:
reg,必选项。将要赋值为正则表达式模式的变量名。
Patter,必选项。要使用的正则表达式模式。如果使用语法 1,用 "/" 字符分隔模式。如果用语法 2,用引号将模式引起来。
Flags ,可选项。如果使用语法 2 要用引号将 flag 引起来。标志可以组合使用,可用的有:
g (全文查找出现的所有 pattern), i (忽略大小写), m (多行查找) .
正则表达式的语法含义:
1.直接量字符
字符 匹配
----------------------------+---------------------------------
字母数字字符 自身
\o NUL字符(对应\ )
\t 制表符(\ )
\n 换行符(\ )
\v 垂直制表符(\ )
\f 换页符(\ )
\r 回车(\ )
\xnn 由十六进制数nn指定的拉丁字符,例如,\x0A等价于\n
\uxxxx 由十六进制xxxx指定的Unicode字符,例如,\ 等价于\t
\cX 控制字符^X,例如,\cJ等价于\n
2.特殊含义字符
^ $ . * + ? = ! : | \ / ( ) [ ] { }
在匹配这些特殊含义字符本身的含义时,要在前面加\,如任何包含\的字符串的正则表达式为:/\\/。
3.字符类
字符 匹配
----------------------------+---------------------------------
[…] 位于括号内的任意字符
[^…] 不在括号内的任意字符
. 除换行符和其他Unicode行中止符之外的任意字符
\w 任何ASCII单字字符,等价于[a-zA-Z0-9_]
\W 任何ASCII非单字字符,等价于[^a-zA-Z0-9_]
\s 任何Unicode空白符
\S 任何非Unicode空白符
\d 任何ASCII数字,等价于[0-9]
\D 除了ASCII数字之外的任何字符,等价于[^0-9]
[\b] 退格直接量(特例)
4.重复
字符 匹配
----------------------------+---------------------------------
{n,m} 匹配前一项至少n次,但是不能超过 m次
{n,} 匹配前一项n次,或更多次
{n} 匹配前一项恰好n次
? 匹配前一项0次或1次,也就是说前一项可选,等价于{0,1}
+ 匹配前一项1次或多次,等价于{1,}
* 匹配前一项0次或多次,等价于{0,}
非贪婪的重复:在匹配模式后面加一个问号,如/a+?/只匹配字符串的第一个字母a。
5.选择、分组和引用
字符 含义
----------------------------+---------------------------------
| 选择,匹配的是该符号左边的子表达式或右边的子表达式
(…) 组合,将几个项目组合为一个单元,这个单元可由*+?|组成
(?:…) 只组合,把项目组合到一个单元,但是不记忆与该组匹配的字符
\n 和第n个分组第一次匹配的字符相匹配,组是括号中的子表达式
(可能是嵌套的),组号是从左到右计数的左括号数,以(?:形式分组的组不编码
6.指定匹配的位置
字符 含义
----------------------------+---------------------------------
^ 匹配字符串的开头,在多行检索中,匹配一行的开头
$ 匹配字符串的结尾,在多行检索中,匹配一行的结尾
\b 匹配一个词语的边界
\B 匹配非词语边界字符
(?=p) 正向前声明,要求接下来的字符都与模式p匹配
(?!p) 反向前声明,要求接下来的字符不与模式p匹配
7.标志
字符 含义
----------------------------+---------------------------------
i 执行大小写不敏感的匹配
g 执行全局匹配,寻找所有的匹配,不在找到第一个匹配后停止
m 多行模式,结合^和$使用(Supported in JavaScript1.5)
用于模式匹配的String方法:search、replace、match、split。
用于模式匹配的RegExp方法:exec、test。
===========================正字表达式举例:==========================================
/s$/ 匹配以字母s结尾的字符串
/\\/ 匹配包含反斜杠\的字符串
/[abc]/ 匹配字母“a”、“b”、“c”中的任何一个字母
/[a-z]/ 匹配拉丁字母集中任何小写字母
/[\?-\?]/ 匹配所有的Cyrillic字符
/[\s\d]/ 匹配任意空白字符或数字
/\d{2,4}/ 匹配与2和4之间的数字
/\w{3}\d?/ 匹配三个字符一个数字
/\s+java\s+/ 匹配字符串java,切该串前后可以有一个或多个空格
/[^”]*/ 匹配零个或多个非引号字符
/ab|cd|ef/ 匹配字符串ab或者cd又或者ef
/\d{3}|[a-z]{4}/ 匹配一个三位数字或者四个小写字母
/java(script)?/ 匹配字符串java,其后可以有script也可以没有
/(ab|cd)+|ef/ 匹配可以是字符串ef,也可以是字符串ab或者cd的一次或多次
/Java(?!Script)([A-Z]\W*)/ 匹配Java跟随一个大写字母和任意多个ASCII字符,但是不能跟随Script
/Java$/im 与Java和Java\nis fun匹配
function Match() {
var rtn, reg; // 声明变量。
var str = "The rain in Spain falls mainly in the plain";
reg = new RegExp("ain","g"); // 创建正则表达式对象。
rtn = str.match(reg); // 在字符串 str 中查找匹配。
return(rtn);
}
/*
功能:验证身份证号码是否有效
提示信息:未输入或输入身份证号不正确!
使用:check_ID(obj)
返回:true 或 false
*/
function check_ID(obj)
{
var aCity={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:"国外"};
var iSum = 0;
var info = "";
var strIDno = obj.value;
var idCardLength = strIDno.length;
if(!/^\d{17}(\d|x)$/i.test(strIDno)&&!/^\d{15}$/i.test(strIDno))
{
f_alert(obj,"非法身份证号");
return false;
}
//在后面的运算中x相当于数字10,所以转换成a
strIDno = strIDno.replace(/x$/i,"a");
if(aCity[parseInt(strIDno.substr(0,2))]==null)
{
f_alert(obj,"非法地区");
return false;
}
if (idCardLength==18)
{
sBirthday=strIDno.substr(6,4)+"-"+Number(strIDno.substr(10,2))+"-"+Number(strIDno.substr(12,2));
var d = new Date(sBirthday.replace(/-/g,"/"))
if(sBirthday!=(d.getFullYear()+"-"+ (d.getMonth()+1) + "-" + d.getDate()))
{
f_alert(obj,"非法生日");
return false;
}
for(var i = 17;i>=0;i --)
iSum += (Math.pow(2,i) % 11) * parseInt(strIDno.charAt(17 - i),11);
if(iSum%11!=1)
{
f_alert(obj,"非法身份证号");
return false;
}
}
else if (idCardLength==15)
{
sBirthday = "19" + strIDno.substr(6,2) + "-" + Number(strIDno.substr(8,2)) + "-" + Number(strIDno.substr(10,2));
var d = new Date(sBirthday.replace(/-/g,"/"))
var dd = d.getFullYear().toString() + "-" + (d.getMonth()+1) + "-" + d.getDate();
if(sBirthday != dd)
{
f_alert(obj,"非法生日");
return false;
}
}
return true;
}