浅析正则表达式模式匹配的String方法

在JavaScript代码中使用正则表达式进行模式匹配常常会用到String对象和RegExp对象的一些方法,例如replace、match、search等方法,如下是对一些方法使用的总结。javascript

String对象中支持正则表达式有4种方法,分别是:search、replace、match、splitjava

str.search(regexp)

定义:search()方法将在字符串str中检索与表达式regexp相匹配的字串,而且返回第一个匹配字串的第一个字符的位置。若是没有找到任何匹配的字串,则返回-1。正则表达式

例如:数组

var str = "Javascript";
    str.search(/script/); // 返回 script 中s的位置为 4
    str.search(/j/i); // 设置正则表达是标识i:忽略大小写,则匹配到J,返回位置0

可是,search()方法不支持全局搜索,由于会忽略正则表达式参数的标识g,而且也忽略了regexp的lastIndex属性,老是从字符串的开始位置进行检索,因此它会老是返回str的第一个匹配的位置。
例如:函数

var str = "javascript is cool";
    str.search(/s/g); // 返回 javascript 中的s位置4,不会继续检索s

str.replace(regexp, replacement)

定义:replace()方法是执行查找并替换的操做。它将正则表达式regexp匹配到的字串,而后用replacement的字符串替换掉字串,若是有全局标识g,则替换所有匹配的字串,不然只替换第一个匹配字串。code

replace方法应该是比较经常使用的一个方法,在字符串替换操做中很是有用的。例如:regexp

一、简单替换

var str = "javascript";
   str.replace(/javascript/,'JavaScript'); // 将字符串javascript替换为JavaScript

二、全局替换

// 使用全局表示g进行全局替换
    var str = "javascript";
    str.replace(/a/g, 'b'); // 将全部的字母a替换为字母b,返回 jbvbscript

三、使用replacement中的特殊字符替换,在replacement中$字符有特殊的意义,具体说明以下表格:

字符 替换文本
$一、$二、...、$99 与regexp中的第1个到99 个子表达式相匹配的文本
$& 与regexp相匹配的字串
$` 位于匹配子串左侧的文本
$' 位于匹配子串右侧的文本
$$ 直接量符号

来看下例子:对象

//一、用子表达式替换:$一、$2等
    var str = "javascript";
    str.replace(/(java)(script)/,'$2$1'); 
   // 表达式中()就是一个子表达式,$1对应是第一个表达式的内容,即java,$2为script,因此替换结果为:scriptjava 


    //二、$& 为正值表达式匹配的字串
    var str = "javascript";
    str.replace(/java/,'$&-'); 
    // 正则表达式经过直接量java来匹配,匹配结果为java,则 $&的值为java,而后用字符串$&-来替换匹配的字串,结果为java-script

    
    // 三、 $`  $'  $$
    var str = "javascript";
    str.replace(/ava/,"$`"); // $`为匹配子串ava的左侧文本,则为j,则替换后ava的结果为:jjscript
    str.replace(/ava/,"$'"); // $'为匹配子串ava的右侧文本,则为script,则替换ava的结果为:jscriptscript
    str.replace(/ava/,"$$"); // $$为直接量符号,即插入一个$符号,替换结果为:j$script

四、使用replacement做为函数替换

replace的参数replacement能够是函数而不是字符串,每一个匹配都会调用该函数,它返回的字符串将做为替换的文本使用。该函数的第一个参数是整个匹配模式的字符串,接下来的参数是与模式中的子表达式匹配的字符串,能够有0个或多个参数。接下来的参数是一个整数,声明了匹配在str中出现的位置。最后的参数是str自身。
来看个例子:blog

// match 为匹配整个字符串,即:'abc12345#$*%'
// p1 为第一个子表达式,([^\d]*),匹配0个或多个非数字的字符,即:abc
// p2 为第二个子表达式,(\d*),匹配0个或多个的数字,即:12345
// p3 为第三个子表达式,([^\w]*),匹配0个或匹配任何非单词字符。等价于 '[^A-Za-z0-9_]',即 #$*%
// offset 为模式匹配出现的位置,从第一个字符已经匹配成功,则位置为0
// string为字符串自己,即 abc12345#$*%

function replacer(match, p1, p2, p3, offset, string) {
  return [p1, p2, p3].join(' - ');
}

var newString = 'abc12345#$*%'.replace(/([^\d]*)(\d*)([^\w]*)/, replacer); 
// 替换结果为:abc - 12345 - #$*%

str.match(regexp)

定义:match()方法是最经常使用的String正则表达式方法。它惟一的参数就是一个正则表达式或者经过RegExp()构造函数来建立正则表达式,返回值是包含了匹配结果的数组。ip

match()方法中的regexp正则表达式通常又分为两种状况:有设置全局标志g和没有设置全局标志g

一、有设置全局标志

若是设置了全局标志g,则返回的数组包含的就是出如今字符串的全部匹配结果,例如:

// 全局匹配
    var str = "1 plus 2 equals 3";
    str.match(/\d/g);  // 匹配字符串中出现的全部数字,并返回一个数组: [1,2,3]

二、没有设置全局标志

若是没有设置全局标志,则就不是全局性的检索,只是检索第一个匹配。这种状况下,match()方法匹配的结果也是返回一个数组,数组的第一个元素就是匹配的字符串,而余下的元素则是正则表达式中用括号括起来的子表达式。来看个例子:

// 非全局匹配
     var str = "visit my blog at http://www.example.com";
     str.match(/(\w+):\/\/([\w.]+)/); // 返回结果:["http://www.example.com", "http", "www.example.com"]
     // 正则表达式匹配的结果为:http://www.example.com
     // 第一个子表达式 (\w+)匹配结果:http
     // 第二个子表达式 ([\w.])匹配结果: www.example.com

str.split(delimiter, limit)

定义:split()方法能够把调用它的字符串分解为一个字串数组,使用的分隔符是它的参数。
参数:
delimiter:字符串或者正则表达式,从该参数指定的地方分割字符串。
limit:指定返回数组的最大长度,若是没有设置该参数,则整个字符串都会被分割。
例如:

//一、 只传一个参数,默认分割整个字符串
var str ="a,b,c,d,e";
str.split(','); // 返回分割的字符串数组:["a", "b", "c", "d", "e"]

//二、传入两个参数
var str ="a,b,c,d,e";
str.split(',',3); //指定限定长度,则返回对应的数组:["a", "b", "c"]
    
//三、使用正则表达式匹配,不包含分割字符串
var str = "aa44bb55cc66dd";
str.split(/\d+/); //经过匹配数字进行分割字符串,但不包含分割的字符串,则返回的结果为:["aa","bb","cc","dd"];

//四、使用正则表达式匹配,包含分割字符串
var str = "aa44bb55cc66dd";
str.split(/(\d+)/); //经过匹配数字进行分割字符串,且分割的字符串是包含在子表达式中,则返回的结果为:["aa", "44", "bb", "55", "cc", "66", "dd"]

以上。

相关文章
相关标签/搜索