RegExp正则相关方法

一、概述

正则表达式(regular expression)是一种表达文本模式(即字符串结构)的方法,有点像字符串的模板,常常用来按照“给定模式”匹配文本。
比如,正则表达式给出一个 Email 地址的模式,然后用它来确定一个字符串是否为 Email 地址。JavaScript 的正则表达式体系是参照 Perl 5 建立的。

新建正则表达式有两种方法。一种是使用字面量,以斜杠表示开始和结束。

var regex = /xyz/;

另一种是使用RegExp构造函数。

var regex = new RegExp('xyz');

实际应用中,基本上都采用字面量定义正则表达式。

二、实例属性

正则对象的实例属性分成两类

1. 一类是修饰符相关,返回一个布尔值,表示对应的修饰符是否设置。

RegExp.prototype.ignoreCase:返回一个布尔值,表示是否设置了i修饰符。
RegExp.prototype.global:返回一个布尔值,表示是否设置了g修饰符。
RegExp.prototype.multiline:返回一个布尔值,表示是否设置了m修饰符。

2. 另一类是与修饰符无关的属性,主要是下面两个。

RegExp.prototype.lastIndex:返回一个数值,表示下一次开始搜索的位置。该属性可读写,但是只在进行连续搜索时有意义,详细介绍请看后文。

RegExp.prototype.source:返回正则表达式的字符串形式(不包括反斜杠),该属性只读。

三、正则的实例方法

(1) RegExp.prototype.test()
正则实例对象的test方法返回一个布尔值,表示当前模式是否能匹配参数字符串。

(2) RegExp.prototype.exec()
正则实例对象的exec方法,用来返回匹配结果。如果发现匹配,就返回一个数组,成员是匹配成功的子字符串,否则返回null。
    var s = '_x_x';
    var r1 = /x/;
    var r2 = /y/;

    r1.exec(s) // ["x"]
    r2.exec(s) // null
    正则对象r1匹配成功,返回一个数组,成员是匹配结果;正则对象r2匹配失败,返回null。
    如果正则表示式包含圆括号(即含有“组匹配”),则返回的数组会包括多个成员。
    第一个成员是整个匹配成功的结果,后面的成员就是圆括号对应的匹配成功的组。也就是说,
    第二个成员对应第一个括号,第三个成员对应第二个括号,以此类推。
    整个数组的length属性等于组匹配的数量再加1。

    exec方法的返回数组还包含以下两个属性:
    input:整个原字符串。
    index:整个模式匹配成功的开始位置(从0开始计数)。

四、字符串的实例方法

String.prototype.match():返回一个数组,成员是所有匹配的子字符串。
String.prototype.search():按照给定的正则表达式进行搜索,返回一个整数,表示匹配开始的位置。
String.prototype.replace():按照给定的正则表达式进行替换,返回替换后的字符串。
String.prototype.split():按照给定规则进行字符串分割,返回一个数组,包含分割后的各个成员

(1) String.prototype.match():

字符串实例对象的match方法对字符串进行正则匹配,返回匹配结果。
var s = '_x_x';
var r1 = /x/;
var r2 = /y/;

s.match(r1)     // ["x"]
s.match(r2)     // null

如果正则表达式带有g修饰符,则该方法与正则对象的exec方法行为不同,会一次性返回所有匹配成功的结果。
var s = 'abba';
var r = /a/g;

s.match(r) // ["a", "a"]
r.exec(s) // ["a"]

(2)String.prototype.search()

字符串对象的search方法,返回第一个满足条件的匹配结果在整个字符串中的位置。如果没有任何匹配,则返回-1。

'_x_x'.search(/x/)    // 1
第一个匹配结果出现在字符串的1号位置。

(3) String.prototype.replace()

字符串对象的replace方法可以替换匹配的值。它接受两个参数,第一个是正则表达式,表示搜索模式,
第二个是替换的内容。

正则表达式如果不加g修饰符,就替换第一个匹配成功的值,否则替换所有匹配成功的值。
'aaa'.replace('a', 'b')     // "baa"
'aaa'.replace(/a/, 'b')     // "baa"
'aaa'.replace(/a/g, 'b')    // "bbb"

replace方法的一个应用,就是消除字符串首尾两端的空格。


(4)String.prototype.split()

字符串对象的split方法按照正则规则分割字符串,返回一个由分割后的各个部分组成的数组。
// 例一
'aaa*a*'.split(/a*/)     // [ '', '*', '*' ]

// 例二
'aaa**a*'.split(/a*/)    // ["", "*", "*", "*"]

上面代码的分割规则是0次或多次的a,由于正则默认是贪婪匹配,
所以例一的第一个分隔符是aaa,第二个分割符是a,将字符串分成三个部分,包含开始处的空字符串。
例二的第一个分隔符是aaa,第二个分隔符是0个a(即空字符),
第三个分隔符是a,所以将字符串分成四个部分。

如果正则表达式带有括号,则括号匹配的部分也会作为数组成员返回。
'aaa*a*'.split(/(a*)/)  // [ '', 'aaa', '*', 'a', '*' ]

正则表达式使用了括号,第一个组匹配是aaa,第二个组匹配是a,它们都作为数组成员返回。

posted @ 2020-10-10 16:19  kgwei  阅读(248)  评论(0编辑  收藏  举报