一、创建正则表达式的方法
1.字面量形式
var expressiion=/pattern/flags;
flags:g全局模式,即将被应用于所有字符串,而非在发现第一个匹配项时立即停止;
i不区分大小写模式;
m多行模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项。
模式中所有的元字符都必须转义。元字符有:([{\^$|)?*+.]}
2.RegExp构造函数
接收两个参数:要匹配的字符串模式,可选的标志字符串
var pattern2=new RegExp('[bc]at','i');
由于RegExp构造函数的模式参数是字符串,所以某些情况下要对字符进行双重转义。所有元字符都必须双重转义,那些已经转义过的字符也是如此,
例如/\[bc\]at/ 字符串中:\\[bc\\]at
二、RegExp实例属性
RegExp的每个实例都具有下列属性,通过这些属性可以取得有关模式的各种信息。
global:是否设置了g标志;
ignoreCase:是否设置了i标志;
lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从0算起;
multiline:布尔值,表示是否设置了m标志;
source:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回。
var pattern1=/\[bc\]at/i;
alert(pattern1.lastIndex)//0;
alert(pattern1.source)// \[bc\]at
var pattern2=new RegExp('\\[bc\\]at','i');
alert(pattern2.lastIndex)//0;
alert(pattern2.source)// \[bc\]at;
三、实例方法
1.exec() 专为捕获组而设计的。接受一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组;或者在没有匹配项的情况下返回null。返回的数组虽然是Array的实例,但包含两个额外的属性:index,input。index表示匹配项在字符串中的位置,而input表示应用正则表达式的字符串。在数组中,第一项是与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串(如果模式中没有捕获组,则该数组只包含一项)。
var test='I and mom and dad and baby';
var pattern=/mon(and dad( and baby)?)?/gi;
var matches=pattern.exec(test);
alert(matches.index);//6
alert(matches.input);//I and mom and dad and baby
alert(matches[0]);//mom and dad and baby
alert(matches[1]);// and dad and baby
alert(matches[2]);// and baby
对于exec()方法而言,即使在模式中设置了全局标志(g),它每次也只会返回一个匹配项。在不设置全局标志的情况下,在同一个字符串上多次调用exec()将始终返回第一个匹配项的信息。而在设置全局标志的情况下,每次调用exec()则都会在字符串中继续查找新匹配项。
var text='cat, bat, sat, fat';
var pattern1=/.at/;
var matches=pattern1.exec(text);
alert(matches.index)//0
alert(matches[0])//cat
alert(pattern1.lastIndex)//0
matches=pattern1.exec(text);
alert(matches.index)//0
alert(matches[0])//cat
alert(pattern1.lastIndex)//0
var pattern2=/.at/g;
var matches=pattern2.exec(text);
alert(matches.index)//0
alert(matches[0])//cat
alert(pattern2.lastIndex)//3
matches=pattern2.exec(text);
alert(matches.index)//5
alert(matches[0])//bat
alert(pattern2.lastIndex)//8
while(matches=pattern2.exec(text)){
alert("index:"+matches.index)
alert("matches[0]:"+matches[0])
alert("pattern2.lastIndex:"+pattern2.lastIndex)
}//每次弹出不一样的内容,循环到字符串结束终止
while(matches=pattern1.exec(text)){
alert("index:"+matches.index)
alert("matches[0]:"+matches[0])
alert("pattern1.lastIndex:"+pattern1.lastIndex)
}//每次弹出内容一样,0 cat 0,循环不会终止
2.test()方法,接受一个字符串参数。在模式与该参数匹配的情况下返回true;否则,返回false。在只想知道目标字符串与某个模式是否匹配,但不需要知道其文本内容的情况下,使用这个方法非常方便。
var text='000-00-0000';
var pattern=/\d{3}-\d{2}-\d{4}/;
if(pattern.test(text)){
alert('The pattern was matched');
}
RegExp实例继承的toLocalString()和toString()方法都会返回正则表达式的字面量,与创建正则表达式的方式无关。
var pattern=new RegExp('\\[bc\\]at','gi');
alert(pattern.toString());// /\[bc\]at/gi 类型string
alert(pattern.toLocaleString()); // /\[bc\]at/gi 类型string
alert(pattern.valueOf()); // /\[bc\]at/gi 类型object
valueOf()方法返回正则表达式本身。
四、RegExp构造函数属性
var text='this has been a short summer,it\'s so short';
var pattern=/(.)hort/g;
while(pattern.test(text)){
alert(RegExp.input);//返回原始字符串;
alert(RegExp.leftContext);//input字符串中lastMatch之前的文本
alert(RegExp.rightContext);//input 字符串中lastMatch之后的文本
alert(RegExp.lastMatch);//最近一次的匹配项
alert(RegExp.lastParen);//最近一次匹配的捕获组
alert(RegExp.multiline);//是否所有表达式都使用多行模式
}
五、正则表达式
1.直接量字符
在正则中一般都会直接匹配字符,如
/javascript/ |
会直接匹配字符javascript
还支持非字母的字符匹配,如:
\o NUL字符(\u0000)
\t 制表符(\u0009)
\n 换行符(\u000A)
\v 垂直制表符(\u000B)
\f 换页符(\u000C)
\r 回车符(\u000D)
\xnn 由十六进制数nn指定的拉丁字符,例如,\x0A等价于\n
\uxxxx 由十六进制数xxxx指定的Unicode字符,例如\u0009等价于\t
\cX 控制字符^X,例如,\cJ等价于换行符\n
在正则表达式中,还有一些有特殊含义的标点符号,他们需要'\'来转义
^$.*+?=!:|\/()[]{}
2.字符类
[...] 方括号内的任意字符
[^...] 不在方括号内的任意字符
. 任意字符
\w 任何ASCII字符组成的单词,等价于[a-zA-Z0-9]
\W 任何不适ASCII字符组成的单词,等价于[^a-zA-Z0-9]
\s 任何Unicode空白符
\S 任何非Unicode空白符的字符,注意\w和\S不一样
\d 任何ASCII数值,等价于[0-9]
\D 除了ASCII数字之外的任何字符,等价于[^0-9]
[\b] 退格直接量(特例)
3.重复(次数)
? 0或1次
+ 1次或多次
* 任意次
{n} n次
{m,n} 最少m次,最多n次
{n,} n次或n次以上
正则默认是贪婪匹配的
如[a+b+] 如果要匹配aaabb,它不会匹配ab和aab等,只会匹配aaabb
[a+?b+?] 这个会匹配aaab 为什么会产生这个区别呢?
答:+?是让正则非贪婪匹配,那么b这里只会匹配一个b,那为什么a会匹配3个呢?这是因为正则表达式的模式匹配总是会寻找字符串中第一个可能匹配的位置。
4.选项|分组|引用
| 用于分隔可供选择的字符,如[ab|cd],他既可以匹配ab也可以匹配cd,注意:选择项的尝试匹配次序是左→右,因此[a|ab],当a匹配通过了之后,就不匹配ab了,就算ab是更好的匹配
() 1.单独的项当成子表达式 /java(script)?/ 可以匹配javascript和java 即圆括号部分形成子的表达式,可以对子表达式执行| * ?等操作
2.完整的模式中定义子模式 后面的可以引用前面圆括号起来的表达式 /(['"])[a-z]\1/ \1引用的是第一个圆括号里的表达式,因此引用了['"]
3.后部引用前面的子表达式 注意: /['"][a-z]['"]/这个正则的意思是 单引号或双引号加上一个小写字母加上一个单引号或者双引号,前后的单双引号不是匹配的
如果你要匹配可以这么写[(['"])[a-z]\1]
\加数字 可以引用前面圆括号中的表达式
5.制定匹配位置(锚点)
^ 匹配字符串的开头,在多行检索中,匹配一行的开头
$ 匹配字符串的结尾,在多行检索中,匹配一行的结尾
\b 匹配一个单词的边界,简言之,就是位于字符\w和\W之间的位置,或位于字符\w和字符串的开头或者结尾之间的位置
\B 匹配非单词边界的位置
(?=p) 零宽正向先行断言,要求接下来的字符都与p匹配,但不能包括匹配p的那些字符
(?!p) 零宽负向先行断言,要求接下来的字符不与p匹配
6.修饰符
写在正则表达式字面量//右侧的
i 执行不区分大小写的匹配
g 执行一个全局匹配,简言之,即找到所有的匹配,而不是在找到第一个之后就停止
m 多行匹配模式,^匹配一行的开头和字符串的开头,$匹配行的结束和字符串的结束 /java$/m 可以匹配 java\nfunc
注意:当正则表达式是全局的时候,每次exec() 和 test()的时候都会把当前设置的lastIndex设为当前的位置,再次执行的时候就会从lastIndex的位置开始执行,因此最好每次执行的时候lastIndex设置为0