正则语法

来源:互联网 发布:一知f君2月13号百度云 编辑:程序博客网 时间:2024/05/21 22:53

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

利用正则表达式限制网页表单里的文本框输入内容:

用正则表达式限制只能输入中文:
onkeyup="value=value.replace(/[^/u4E00-/u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^/u4E00-/u9FA5]/g,''))"

用正则表达式限制只能输入全角字符:
onkeyup="value=value.replace(/[^/uFF00-/uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^/uFF00-/uFFFF]/g,''))"

用正则表达式限制只能输入数字:
onkeyup="value=value.replace(/[^/d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^/d]/g,''))"

用正则表达式限制只能输入数字和英文:
onkeyup="value=value.replace(/[/W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^/d]/g,''))"

 

原创粉丝点击