博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

JS---正则表达式

Posted on 2013-06-12 19:17  Amy-lover  阅读(313)  评论(0编辑  收藏  举报

1.元字符

. 除了换行符以外的任意字符
\w 匹配任何ASC||单字字符,字母,数字,下划线等,等价于[a-zA-Z0-9_]
\s 匹配任意空白字符,包括空格、制表符、换行符等
\d 匹配数字
\b 代表单词的开头或结尾,即单词的分界处
^ 字符串的开始,与\b差不多,匹配的都是一个位置
$ 字符串的结束
* 也是元字符,它匹配的不是位置,而是数量,指它前面的内容可以连续重复任意多次

例如:\ba\w*\b:以字母a开头的单词,首先是\b单词开始,然后是字母a,再然后是\w任意的单字字符,下划线,数字或者字母等,然后是单词结束\b,\b并不匹配单词分隔符(空格,标点符号,换行)中的任何一个,它只匹配一个位置

var r=/\ba\w*\b/;
var s="abc_2 abw_ aaasd";
var a=s.match(r);
alert(a);//abc_2

2 字符转义:如果你想查找元字符本身的话,如你查找.或* ,就出现了问题:你没办法指定它们,因为它们会被解释成别的意思。这时你就得使用\来取消这些字符的特殊意义。因此,你应该使用\.和\*。当然,要查找\本身,你也得用\\ .

C:\\Windows匹配的是C:\Windows

3 重复

* 重复0次或者多次
+ 重复1次或者多次
重复0次或者1次
{n} 重复n次
{n,} 重复n次或者多次
{n,m} 至少重复n次,但不超过m次

^\d{5,12}$:数字,重复的次数不能少于5次,不能多于12次,必须输入5到12个数字

4 字符类:小要查找数字,字母,空白等很简单,使用1中对应这些字符集合的元字符即可,但是想匹配没有预定义元字符的字符集合,只需要在方括号里列出它们就可以了,利用[]和-可以轻松地指定一个字符范围,例如[0-9]:表示数字0-9,[a-z]:表示单字字符a,b,……,z,[aeiou]代表英文元音字母

5 分支条件:正则表达式中的分支条件是指有多种规则,如果满足其中任意一种规则都应该当成匹配,利用|把不同的规则进行分隔,相当于的情况

\d{5}-\d{4}|\d{5}:表示xxxxx-xxxx或者xxxxx

在使用分支条件的时候,要注意:各个条件的顺序,因为在匹配分支条件时,将会从左到右地测试每一个条件,如果满足了某个条件,那么后面的其他条件就不再管了。

var r=/\d{5}|\d{5}-\d{4}/;
var s="12345-01234  67891";
var a=s.match(r);
alert(a);//12345

6 分组:我们已经给出了如何重复单个字符,如果想要重复多个字符,则需要使用分组,即 使用小括号()。使用小括号指定一个子表达式后,默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。默认\1代表分组1匹配的文本

(\d{1,3}\.){3}\d{1,3}:

\d{1,3}:匹配1到3位的数字

\.:转义字符.

(\d{1,3}\.):这是一个分组,该分组的规则是匹配1到3位数字,这些数字后面有一个.

(\d{1,3}\.){3}:然后将这个分组重复3次

(\d{1,3}\.){3}\d{1,3}:最后再加上一个一到三位的数字

7 反义:有时需要查找不属于某个能简单定义的字符类的字符

\W 匹配任何非ASC||单字字符
\S 匹配任何非空白符
\D 匹配任何非数字
\B 匹配不是单词开头或结尾的任意位置
[^x] 匹配除了x以外的任意字符

<a[^>]+>:匹配用以<a开头的字符串,非>的任意字符重复至少一次到多次,然后是>

8 反向引用在正则表达式执行匹配运算时,表达式运算会自动把每个分组(子表达式)匹配的文本都存储在一个特殊的地方,以备以后使用,这些存储在分组中的特殊值,被称之为反向引用(后向引用)。反向引用将遵循从左到右的顺序,根据表达式中的左括号字符的顺序进行创建和编号

用法一、在使用正则表达式对象的test方法时以及字符串对象的match方法和search方法时,反向引用的值可以从RegExp()构造函数中获得 
var s="abcdefg";
var reg=/(a(b(c)))/;
var a=s.match(reg);
alert(a);//abc abc bc c
//在使用正则表达式对象的test方法时以及字符串对象的match方法和search方法时,反向引用的值可以从RegExp()构造函数中获得
alert(RegExp.$1);//abc,第一个分组的匹配文本
alert(RegExp.$2);//bc,第二个分组的匹配文本
alert(RegExp.$3);//c,第三个分组的匹配文本

用法二、可以直接在定义分组的表达式中包含反向引用,可以通过特殊的转义序列(\1或者\2)来实现

var s1="go go";
var s2="go home";
var reg=/\b(\w+)\b\s+\1\b/;
var a1=reg.test(s1);
var a2=reg.test(s2);
alert(a1);//true
alert(a2);//false

 用法三、可以在字符串对象的replace方法中使用,通过使用特殊的字符序列$1,$2,$3等来实现。例如下面将电到相邻字母和数字的位置

var s="1a2b3c4d5e";
var reg=/(\d+)(\w+?)/g;//数字,字母
var a=s.replace(reg,"$2$1");//现在成了字母,数字,第一个分组与第二个分组互换了位置
alert(a);//a1b2c3d4e5

 8 后向引用:用于重复搜索前面某个分组匹配的文本

使用小括号指定一个分组后,匹配这个分组的文本可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。,\1代表分组1匹配的文本

\b(\w+)\b\s+\1\b:go go或者hi hi等诸如此类重复的单词

\b(\w+)\b:单词开始处和结束处之间的多于一个的字母或数字

\s+:1个或几个空白符

\1:分组1中捕获的内容

\b:单词结束

9 零宽断言:用来查找某些内容(不包括这些内容)之前或者之后的东西,即用来指定一个位置,这个位置应该满足一定的条件(这个条件称为断言)

(exp) 匹配exp,并捕获文本到自动命名的组里
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
(?=exp) 匹配exp前面的位置
(?<=exp)JS不支持 匹配exp后面的位置JS不支持
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp)JS不支持 匹配前面跟的不是exp的位置JS不支持

零宽度正预测先行断言:(?=exp),它断言自身出现的位置的后面能匹配表达式exp

例如\b\w+(?=ing\b):以ing结尾的单词的前面部分(除了ing以外的部分),I'm singing while you're dancing.会匹配该字符串的sing

var r=/\b\w+(?=ing\b)/;
var s="I'm singing while you're dancing";
var a=s.match(r);
alert(a);//sing

零宽度负预测先行断言:(?!exp),匹配后面不是exp的位置

例如\d{3}(?!\d):匹配三位数字,而且这三位数字的后面不能是数字,

var r=/\d{3}(?!\d)/;
var s="123 1234 234";
var a=s.match(r);
alert(a);//123

10 贪婪匹配:先看整个字符串是否匹配,如果不匹配,则去掉字符串中的最后一个字符,并再次尝试,如果发现还不匹配,则再去掉最后一个字符,如此递归,直到发现一个匹配或者字符串去不剩下任何字符为止,所有重复类的元字符都有贪婪特性

var r=/<.*>/;
var s="<html><head></head><body></body></html>";
var a=s.match(r);
alert(a);//<html><head></head><body></body></html>

弱贪婪性:(.,?,{n},{n,m})主要表现为贪婪的有限性,对于.元字符来说,在选择匹配或者不匹配时,如果条件允许,总会选择匹配,对于{n,m}来说在选择匹配次数时,在条件允许的情况下,会选择匹配m次,而不是n次,即在遵循匹配条件的基础上尽可能占有更多的字符

强贪婪性:(*,+,{n,}),主要体现在贪婪的无限性上,即*可以有最长的长度匹配

正则表达式的贪婪性,让它总与最长的长度匹配,而且排在左侧的重复类匹配符的优先级就越高,例如下面这个例子,左侧重复类具有较大优先权,并尽可能多的占有符合条件的字符,留最小的匹配机会给右侧的重复类

var r=/<.*>(<.*>)/;
var s="<html><head></head><body></body></html>";
var a=s.match(r);
alert(a[0]);//<html><head></head><body></body></html>
alert(a[1]);//</html>

11 惰性匹配:先查看字符串中的第一个字符是否匹配,如果匹配条件不够,再读入第二个字符,依次递归,直到找到匹配或者整个字符串全部检查完毕

惰性匹配的方法:只需要在重复类后面添加问号?就可以了

*? 重复任意次,但尽可能少重复,尽可能不重复
+? 尽量重复1次,也可以重复多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复,尽可能不重复
{n,}? 重复n次以上,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复

12 操作RegExp对象

 12.1 RegExp对象的实例属性

global只读 返回boolean值,正则表达式是否全局匹配
ignoreCase只读 返回boolean值,正则表达式是否区分大小写
mulitiline只读 返回boolean值,正则表达式是否多行匹配
lastIndex 返回整数值,表示下次匹配的起始位置,只有调用exec和test方法时有效
source只读 返回正则表达式的源字符串文本
var r=/a/gi;
alert(r.global);//true
var r=/a/g;
var s="javascript is not java";
r.exec(s);
alert(r.lastIndex);//2
r.exec(s);
alert(r.lastIndex);//4
r.lastIndex=21;
r.exec(s); 

   12.2 各种模式匹配的方法

方法 所属对象 参数 返回值 通用性 特殊性
exec 正则表达式 字符串 匹配结果的数组,或者null 通用 一次只能匹配一个单元
test 正则表达式 字符串 布尔值,表示是否匹配 快速验证 一次只能匹配一个单元
search 字符串 正则表达式 匹配的起始位置或者-1 简单字符定位 不执行全局匹配
match 字符串 正则表达式 匹配的数组或者匹配信息的数组 常用字符匹配方法 依据全局模式标示,来决定匹配操作
replace 字符串 正则表达式 返回替代后的新的字符串 匹配替换操作 可以支持替换函数

 实例解析

 1,正则匹配空格的问题,例如:蓝 色  理   想->蓝色理想

var str="蓝 色    理   想"
var reg=/\s+/g;//\s匹配任意空白字符,包括空格、制表符、换行符等,+表示重复1次或者多次
str = str.replace(reg,"");
alert(str);//蓝色理想

2,判断字符串是不是由数字组成

var reg = /^\d*$/;//^表示字符串的开始,$表示字符串的结束,\d表示数字,*表示重复0次到多次
var str = "7654321"; 
alert(reg.test(str));//true
var str = "22est"; 
alert(reg.test(str));//false

3,电话号码:区号3-4位数字,必填,电话号码8位数字,必填,区号与电话号码之间有-连接,分机号码3-4位数字,选填,但是如果填写的话与电话号码用-连接

var reg = /^\d{3,4}-\d{7,8}(-\d{3,4})?$/;
//^表示字符串的开始,$表示字符串的结束,\d表示数字,{3,4}表示重复3到4次,()表示分组,?表示出现0次到1次 var str = "123-12345678-123"; alert(reg.test(str));//true var str = "12-123456789-123"; alert(reg.test(str));//false

4,删除字符串左右两端的空格

var reg = /^\s+|\s+$/;//^表示字符串的开始,$表示字符串的结束,\s表示空格,+表示重复1到多次
//|表示分支,即满足其中任意一种规则都应该当成匹配
var str = " test "; alert(str.replace(reg,''));//test

5,只能输入英文,中文全部用a替换掉

var reg =/[\u4E00-\u9FA5\uf900-\ufa2d]/g;//[]整体代表一个字符,\u4e00-\u9fa5中文的unicode范围
var str = "有中文test"; 
alert(str.replace(reg,'a'));//aaatest

6,只能输入中文,英文全部被”哦“替换掉

var reg = /[^\u4E00-\u9FA5\uf900-\ufa2d]/g;//原则上正则的一个字符对应一个字符,我们可以用[]把它们括起来,让[]这个整体对应一个字符
//另外,这里使用^表示反义,即不属于该类的字符
var str = "有中文test"; 
alert(str.replace(reg,'哦'));//将非中文替换掉

7,获取文件名,将文件路径全部替换掉

var reg = /[^\\\/]*[\\\/]+/g;//[^]表示反义,不属于此类的字符,"\\"表示"\","\/"表示"/",
//[\\\/]表示\或者/,由于[]只表示一个字符,因此这里不需要使用分支"|",*表示0次到多次,+表示1次到多次
var str = "c:\\images\\tupian\\006.jpg"; alert( str.replace(reg,''));//006.jpg var str2 = "c:/images/tupian/test2.jpg"; alert( str2.replace(reg,''));//test2.jpg

8,用户名只能用中文、英文、数字、下划线、4-16个字符。

var reg =/^[\u4E00-\u9FA5\uf900-\ufa2d\w]{4,16}$/g;
//^字符串的开始,$字符串的结束,{4,16}重复4-16次,
//\u4E00-\u9FA5\uf900-\ufa2d中文,\w匹配任何ASC||单字字符,包括下划线,数字和大小写字母[a-zA-Z_0-9]
var str1 = '超级无敌用户名regExp';
var str2 = '捣乱的@';
var str3 = '太长longlonglonglonglonglonglonglong';
alert(reg.test(str1));//true
alert(reg.test(str2));//false
alert(reg.test(str3));//false

9,"点", "字母","空格","逗号","数字",但开头和结尾只能是字母。

var reg =/^[a-zA-Z][\.a-zA-Z\s,0-9]*?[a-zA-Z]+$/;
//^开始,$结束,[a-zA-Z]字母一个,"."要进行转义"\.",空格是\s,数字是0-9