JS基础6

2018-10-31  本文已影响0人  pp_5793

正则表达式

定义:它是一个描述字符模式的对象。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():按照给定规则进行字符串分割,返回一个数组,包含分割后的各个成员。

上一篇下一篇

猜你喜欢

热点阅读