正则表达式
定义:它是一个描述字符模式的对象。Javascript的ReExp类表示正则表达式,String 和ReExp都定义了方法,后者使用正则表达式进行强大的模式匹配和文本搜索与替换的能力。
(1)正则表达式直接量定义为包含在一对斜杠之间的字符
var patter=/s$/;
运行以上代码,会创建一个新的ReExp对象,并将它赋值给变量patter
,这个ReExp对象是用来匹配所有以“s”结尾的字符串。
(2)用构造函数ReExp()
也可以定义与上面代码中等价的正则表达式:
var pattern=new ReExp("s$");
正则表达式的模式规则是由一个字符序列组成的,包括所有字母和数字组成,大多数的字符都是看作是待匹配的字符,比如/java/可以匹配任何包括“java”的字符串。还有一些特殊的字符,比如上面看到的/s$/
中的/$/
就表示是匹配字符串的结尾。
字符类
将直接量单独放在方括号内据组成了字符类,一个字符类可以匹配它所包含的任意字符。因此正则表达式/[a b c]/
就和字母"a","b","c"中的任何一个都匹配。另外,可以通过"^"符号来否定字符类,它匹配所有不包含在方括号内的字符:/[^abc]/
匹配的是除"a","b",
"c"之外的所有字符。字符类可以使用连字符来表示字符范围,例如/[a-z]/
,就表示匹配的是所有小写字母,/[a-zA-Z0-9]/
则表示匹配所有拉丁字母以及数字。
重复
用刚刚学会的正则表达式的语法,可以把两位数表达成/\d\d/
(\d
表示0到9的数字)。
正则表达式的重复字符语法:
(1){n,m}:表示匹配前一项至少n次,但是不能超过m次。
(2){n,}:匹配前一项n次或者更多次
(3){n}:匹配前一项n次
(4)?:匹配前一项0次或1次
(5)+:匹配前一项1次或多次
(6)*:匹配前一项0次或多次
注意上例都是向前匹配的
eg:
/\d{2,4}/
: 匹配两到四个数字。
/\w{3}\d?/
:精确匹配三个单词和一个可选的数字。
/\s+java\s+/
:匹配前后带有一个或多个空格的字符串“java”。
/[^(]*/
:匹配0个或多个非左括号的字符。
注意在使用?和 * 时要注意,它两允许啥也不匹配,也就是满足任意值也可以。
正则表达式的选择、分组和引用
(1)字符"|"用于分隔供选择的字符。
/ab|cd|ef/
可以匹配字符串“ab”或"cd"或"ef"。
(2)圆括号
作用1 :把单独的项组合成子表达式,以便可以像处理一个独立的单元那样用"|","*","+"或者"?"等对圆括号内的项进行处理。
作用2:在完整的模式中定义子模式。
作用3:允许在同一个正则表达式的后面引用前面的子表达式。
|
:选择
(...)
:组合,将几个项组合为一个单元,这个单元可以通过各种匹配符,也可以记住和这个组合相匹配的字符串以供将来的使用。
(?:...)
:只组合,不提供记忆
\n
和第n个分组第一次匹配的字符相匹配,组是圆括号中的表达式(也可能是嵌套的),组索引是从左到右的左括号数,“(?:”形式的不编码。
指定匹配位置
锚字符
^:匹配字符串的开头,在多行检索中,只匹配一行的开头
$:匹配字符串的结尾,在多行检索中,只匹配一行的结尾
\b:匹配一个单词的边界,简言之,就是位于字符\w和\W的位置,或位于字符\w和字符串开头或结尾的位置。和前面提到的[\b]区别开,[\b]匹配的是退格符
\B:匹配非单词边界的位置
(?=p):先行断言,括号里面的p不会匹配到,但是会匹配到在p之前的内容:
var m ='abc'.match(/b(?=c)/);
console.log(m);
输出:
[ 'b', index: 1, input: 'abc', groups: undefined ]
[Finished in 0.6s]
以上代码可以看出m匹配到的是b
,从而验证上面的解释。
(?!p):先行否定断言,与上面的用法相反,它是用来匹配前面的字符不存在的符号。
匹配后面没有百分号的数字(%也不用返回):
/\d+(?!%)/
修饰符
修饰符一般放在正则表达式的最后面:
var regex=/text/g;
(修饰一个字符)
var regex=/text/ig;
(修饰多个字符)
(1)g修饰符:全局修饰符
用法:
var regex = /b/g;
var str = 'abba';
regex.test(str); // true
regex.test(str); // true
regex.test(str); // false
上面代码中,正则模式含有g修饰符,每次都是从上一次匹配成功处,开始向后匹配。因为字符串abba只有两个b,所以前两次匹配结果为true,第三次匹配结果为false。
(2)i修饰符:可以使字符串不再区分字母大小。直接放在正则表达式后面
(3)m修饰符:该修饰符表示多行模式。
在有^
和$
在的地方可使用在正则表达式的后面加上该修饰符,表示可以忽略对换行的匹配:
/world$/.test('hello world\n') // false
/world$/m.test('hello world\n') // true
RegExp实例属性
(1)与修饰符相关的属性,返回布尔值,表示对应的修饰符是否设置。
RegExp.prototype.ignoreCase
:返回一个布尔值,表示是否设置了i修饰符。
RegExp.prototype.global
:返回一个布尔值,表示是否设置了g修饰符。
RegExp.prototype.multiline
:返回一个布尔值,表示是否设置了m修饰符。
ar r =/abc/igm;
console.log(r.ignoreCase);
console.log(r.global);
console.log(r.multiline);
输出:
true
true
true
[Finished in 0.3s]
(2)与修饰符无关的属性:
RegExp.prototype.lastIndex
:返回一个整数,表示下一次开始搜索的位置。该属性可读写,但是只在进行连续搜索时有意义,详细介绍请看后文。
RegExp.prototype.source
:返回正则表达式的字符串形式(不包括反斜杠),该属性只读。
var r= /abc/igm;
console.log(r.lastIndex);
console.log(r.source);
输出:
0
abc
[Finished in 0.3s]
实例方法:
(1)RegExp.prototype.test()
该方法返回一个布尔值,表示当前模式是否能匹配参数字符串。eg:
var r=/a/g;
var s='aaaa';
console.log(r.lastIndex);
console.log(r.test(s));
console.log(r.lastIndex);
console.log(r.test(s));
console.log(r.lastIndex);
console.log(r.test(s));
console.log(r.lastIndex);
console.log(r.test(s));
输出:
0
true
1
true
2
true
3
true
对以上代码进行解释如下:
注意在lastIndex
属性后再进行 test()
方法时,会在它所指的索引的后一个开始执行。当然如果两行代码互换之后,就是先检查是否匹配,然后再看索引是多少咯。
(2)RegExp.prototype.exec()
正则实例对象的exec()
方法,用来返回匹配结果。如果发现匹配,就返回一个数组,成员是匹配成功的子字符串,否则返回null
。
var reg=/a/g;
var str = 'abc_abc_abc';
while(true){
var match =reg.exec(str);
if (!match)break;
console.log('#'+match.index+':'+match[0]);
}
输出:
#0:a
#4:a
#8:a
[Finished in 0.2s]
注意以上代码里面这个match[0]
好诡异,可能是break
的关系,每次退出后都从0开始计数。
字符串的实例方法
字符串的实例方法之中,有4种与正则表达式有关。
String.prototype.match()
:返回一个数组,成员是所有匹配的子字符串。
String.prototype.search()
:按照给定的正则表达式进行搜索,返回一个整数,表示匹配开始的位置。
String.prototype.replace()
:按照给定的正则表达式进行替换,返回替换后的字符串。
String.prototype.split()
:按照给定规则进行字符串分割,返回一个数组,包含分割后的各个成员。
网友评论