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