1. RegExp 对象
什么是 RegExp?
RegExp 对象用于规定在文本中检索的内容。
RegExp 是正则表达式的缩写。
当您检索某个文本时,可以使用一种模式来描述要检索的内容。RegExp 就是这种模式。
简单的模式可以是一个单独的字符。更复杂的模式包括了更多的字符,并可用于解析、格式检查、替换等等。
可以规定字符串中的检索位置,以及要检索的字符类型,等等。
2. 定义 RegExp
RegExp 对象用于存储检索模式。
定义正则表达式有两种形式,一种是普通方式,一种是构造函数方式。
普通方式
var reg=/表达式/附加参数
var regx=/abcd/g;
表达式:一个字符串,代表了某种规则,其中可以使用某些特殊字符,来代表特殊的规则,后面会详细说明。
附加参数:用来扩展表达式的含义,目前主要有三个参数:
g:代表可以进行全局匹配。
i:代表不区分大小写匹配。
m:代表可以进行多行匹配。
上面三个参数,可以任意组合,代表复合含义,当然也可以不加参数。组合的时候例如gi没有间隔
构造函数类型
var reg=new RegExp("*b");
var reg=new RegExp("abc+f","g");
3. RegExp 表达式
正则表达式 元字符表
. 匹配任何单个字符 :例如 /a.b/那么acb将符合,但是acd不符合;
[字符] 匹配[]内的字符:例如[bc] 那么 abd或者acd将符合要求,但是abcd不符合,因为只能匹配其中一个而不能全部匹配
[^字符] 匹配不能存在[]内的字符:
/ 转义符号,将下一个字符标记为一个特殊字符
^ 匹配从第一个字母开始。如果有多行匹配的话那么只要有一行开始符合即可
$ 匹配以最后一个字母结束。
/w 匹配一个数字、_或字母字符。也就是[A-Za-z0-9_]
/d 匹配一个数字字符0-9
/D 匹配非一个数字
/s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ /f/n/r/t/v]。
/S 匹配任何非空白字符。
{n,} 表示匹配{}前一个字符至少连续重复n次 例如/^/d{2,}/意思是以数字开头至少2个
{n} 表示前一个字符必须出现n次。/^/d{8}$/ 这个表示从头开始有8个数字一直匹配到结尾,也就是只能输入8个数字才符合
{n,m} 表示匹配{}前一个字符连续重复n-m之间次包含n,m;
? 对前一个字符做0次或1次匹配,例如/^0?13/ 意思是说开头可以有一个0或者没有0
+ 匹配前一个字符1次或者多次,比如说/ab+/意思说至少ab有一个;
* 匹配前一个字符0次或多次
var regx=/^/d/;
var s=regx.test("a8bcd") //false
var regx=//w/i;
var s=regx.test("ABCD") //true
var regx=/a{3}/;
var s=regx.test("afaa43_") //false
var regx=//W/;
var s=regx.test("azA_d")
4. RegExp 对象的方法
test()
test() 方法检索字符串中的指定值。返回值是 true 或 false。
例子:
var patt1=new RegExp("e");
document.write(patt1.test("The best things in life are free"));
由于该字符串中存在字母 "e",以上代码的输出将是: true
var regx=/a{3}/;
var s = regx.test("aaabc");
alert(s);
exec()
exec() 方法检索字符串中的指定值。返回值是被找到的值。如果没有发现匹配,则返回 null。
var patt1=new RegExp("e");
document.write(patt1.exec("The best things in life are free"));
由于该字符串中存在字母 "e",以上代码的输出将是: e
我们之前学习的String对象中也有几个可以使用正则表达式的方法
replace(正则表达式,"替换内容");
var regx=/user/d/g;
var str="user13userddduser345";
var rs=str.replace(regx,"--");
运行结果是:--3userddd--45
match(正则表达式)
返回匹配的一个字符串数组,正则表达式没有加g参数的话返回第一个匹配,加了g返回所有匹配
返回的数组字符串格式:
第一个 用来匹配的字符串;
然后是匹配的字符串列表;
字符串数组最后一个值为匹配字符串的最后一个字符位置+1;
倒数第二个数组值为 最后一次匹配字符串的位置;
var regx=/user/d/g;
var str="1user13";
var rs=str.match(regx);
for(var i in rs)
{
document.write(rs[i]+"<br>");
}
运行结果是:
1user13
user1
1
6
search(正则表达式)
返回字符串中与正则表达式相匹配的第一个匹配的index值。
var regx=/user/d/g;
var str="user13userddduser345";
var rs=str.search(regx);
运行结果是:0
split(正则表达式)
将字符串以匹配正则表达式的部分做分割,返回一个数组,而且表达式是否附加参数g都没有关系,结果是一样的。
<script type="text/javascript">
var regx=/user/d/g;
var str="111111111111111111user13userddduser345";
var rs=str.split(regx);
for(var i in rs)
{
document.write(rs[i]+"<br>")
}
</script>
运行结果是:
111111111111111111
3userddd
45
5. 常用正则表达式
匹配中文字符的正则表达式: [/u4e00-/u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
匹配双字节字符(包括汉字在内):[^/x00-/xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
匹配空白行的正则表达式:/n/s*/r
评注:可以用来删除空白行
匹配HTML标记的正则表达式:<(/S*?)[^>]*>.*?<//1>|<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
匹配首尾空白字符的正则表达式:^/s*|/s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
匹配Email地址的正则表达式:/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*
评注:表单验证时很实用
匹配网址URL的正则表达式:[a-zA-z]+://[^/s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用
匹配国内电话号码:/d{3}-/d{8}|/d{4}-/d{7}
评注:匹配形式如 0511-4405222 或 021-87888822
匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始
匹配中国邮政编码:[1-9]/d{5}(?!/d)
评注:中国邮政编码为6位数字
匹配身份证:/d{15}|/d{18}
评注:中国的身份证为15位或18位
匹配ip地址:/d+/./d+/./d+/./d+
评注:提取ip地址时有用
匹配特定数字:
^[1-9]/d*$ //匹配正整数
^-[1-9]/d*$ //匹配负整数
^-?[1-9]/d*$ //匹配整数
^[1-9]/d*|0$ //匹配非负整数(正整数 + 0)
^-[1-9]/d*|0$ //匹配非正整数(负整数 + 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)$ //匹配浮点数
^[1-9]/d*/./d*|0/./d*[1-9]/d*|0?/.0+|0$ //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]/d*/./d*|0/./d*[1-9]/d*))|0?/.0+|0$ //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正
匹配特定字符串:
^[A-Za-z]+$ //匹配由26个英文字母组成的字符串
^[A-Z]+$ //匹配由26个英文字母的大写组成的字符串
^[a-z]+$ //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$ //匹配由数字和26个英文字母组成的字符串
^/w+$ //匹配由数字、26个英文字母或者下划线组成的字符串
匹配中国移动电话:
/^0?13[0-9]{9}$/gi
匹配MSN帐号:
/^[^/s@:"'<>,&]{2,}@[^/[/.]+/.[^/[]{2,}$/gi
匹配网页网址:
/^(http|https):[A-Za-z0-9%/-_@]+/.[A-Za-z0-9%/-_@]{2,}[A-Za-z0-9/.//=/?%/-&_~`@[/]:+!;]*$/gi
邮箱验证:
/^[^/s@:"'<>,&]{2,}@[^/[/.]+/.[^/[]{2,}$/gi
利用正则表达式限制网页表单里的文本框输入内容:
用正则表达式限制只能输入中文:
οnkeyup="value=value.replace(/[^/u4E00-/u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^/u4E00-/u9FA5]/g,''))"
用正则表达式限制只能输入全角字符:
οnkeyup="value=value.replace(/[^/uFF00-/uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^/uFF00-/uFFFF]/g,''))"
用正则表达式限制只能输入数字:
οnkeyup="value=value.replace(/[^/d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^/d]/g,''))"
用正则表达式限制只能输入数字和英文:
οnkeyup="value=value.replace(/[/W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^/d]/g,''))"