和正则相关的方法

1. String.prototype.replace

语法: str.replace(regexp|substr, newSubStr|function)

返回值: 一个部分或全部匹配由替代模式所取代的新的字符串

描述: 该方法并不改变调用它的字符串本身,而只是返回一个新的替换后的字符串。 在进行全局的搜索替换时,正则表达式需包含 g 标志。

变量名 变量含义
$$ 插入一个 "$"。
$& 插入匹配的子串。
$` 插入当前匹配的子串左边的内容。
$' 插入当前匹配的子串右边的内容。
$n 假如第一个参数是 RegExp对象,并且 n 是个小于100的非负整数,那么插入第 n 个括号匹配的字符串。

替换字符串可以插入下面的特殊变量名:

变量名 变量含义
$$ 插入一个 "$"。
$& 插入匹配的子串。
$` 插入当前匹配的子串左边的内容。
$' 插入当前匹配的子串右边的内容。
$n 假如第一个参数是 RegExp对象,并且 n 是个小于100的非负整数,那么插入第 n 个括号匹配的字符串。

指定一个函数作为参数

你可以指定一个函数作为第二个参数。在这种情况下,当匹配执行后, 该函数就会执行。 函数的返回值作为替换字符串。 (注意: 上面提到的特殊替换参数在这里不能被使用。)

另外要注意的是, 如果第一个参数是正则表达式, 并且其为全局匹配模式, 那么这个方法将被多次调用, 每次匹配都会被调用。

参数名 描述
match 匹配的子串。(对应于上述的$&。)
p1,p2,... 假如replace()方法的第一个参数是一个RegExp 对象,则代表第n个括号匹配的字符串。(对应于上述的$1,$2等。)
offset 匹配到的子字符串在原字符串中的偏移量。(比如,如果原字符串是“abcd”,匹配到的子字符串是“bc”,那么这个参数将是1)
string 被匹配的原字符串。

函数的参数

参数名 描述
match 匹配的子串。(对应于上述的$&。)
p1,p2,... 假如replace()方法的第一个参数是一个RegExp 对象,则代表第n个括号匹配的字符串。(对应于上述的$1,$2等。)
offset 匹配到的子字符串在原字符串中的偏移量。(比如,如果原字符串是“abcd”,匹配到的子字符串是“bc”,那么这个参数将是1)
string 被匹配的原字符串。
    function replacer(match, p1, p2, p3, offset, string) {
        // p1 is nondigits, p2 digits, and p3 non-alphanumerics
        return [p1, p2, p3].join(' - ');
    }
    var newString = 'abc12345#$*%'.replace(/([^\d]*)(\d*)([^\w]*)/, replacer);
    console.log(newString);  // abc - 12345 - #$*%
    var re = /(\w+)\s(\w+)/;
    var str = "John Smith";
    var newstr = str.replace(re, "$2, $1");
    console.log(newstr);  // Smith, John
    function styleHyphenFormat(propertyName) {
        function upperToHyphenLower(match) {
            return '-' + match.toLowerCase();
        }
        return propertyName.replace(/[A-Z]/g, upperToHyphenLower);
    }
    styleHyphenFormat('borderTop') // 'border-top'

2. String.prototype.match

语法: str.match(regexp);

参数: 一个正则表达式对象。如果传入一个非正则表达式对象,则会隐式地使用 new RegExp(obj) 将其转换为一个 RegExp。 如果你未提供任何参数,直接使用 match() ,那么你会得到一个包含空字符串的 Array :[""] 。

返回值: 如果字符串匹配到了表达式,会返回一个数组,数组的第一项是进行匹配完整的字符串,之后的项是用圆括号捕获的结果。如果没有匹配到,返回null

描述

  1. 如果正则表达式不包含 g 标志,则 str.match() 会返回和 RegExp.exec() 相同的结果。而且返回的 Array 拥有一个额外的 input 属性,该属性包含被解析的原始字符串。
  2. 另外,还拥有一个 index 属性,该属性表示匹配结果在原字符串中的索引(以0开始)。如果正则表达式包含 g 标志,则该方法返回一个 Array ,它包含所有匹配的子字符串而不是匹配对象。
  3. 捕获组不会被返回(即不返回index属性和input属性)。如果没有匹配到,则返回 null 。
    var str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
    var regexp = /[A-E]/gi;
    var matches_array = str.match(regexp);
    console.log(matches_array); // ['A', 'B', 'C', 'D', 'E', 'a', 'b', 'c', 'd', 'e']
    var str = 'For more information, see Chapter 3.4.5.1';
    var re = /see (chapter \d+(\.\d)*)/i;
    var found = str.match(re);
    console.log(found);
    // logs [ 'see Chapter 3.4.5.1',
    //        'Chapter 3.4.5.1',
    //        '.1',
    //        index: 22,
    //        input: 'For more information, see Chapter 3.4.5.1' ]
    
    // 'see Chapter 3.4.5.1' 是整个匹配。
    // 'Chapter 3.4.5.1' 被'(chapter \d+(\.\d)*)'捕获。
    // '.1' 是被'(\.\d)'捕获的最后一个值。
    // 'index' 属性(22) 是整个匹配从零开始的索引。
    // 'input' 属性是被解析的原始字符串。

3. String.prototype.search

语法: str.search(regexp)

参数: 一个正则表达式(regular expression)对象。如果传入一个非正则表达式对象,则会使用 new RegExp(obj) 隐式地将其转换为正则表达式对象。

返回值: 如果匹配成功,则 search() 返回正则表达式在字符串中首次匹配项的索引。否则,返回 -1。

4. String.prototype.split

语法: str.split([separator[, limit]])

Tip:

  1. 如果空字符串("")被用作分隔符,则字符串会在每个字符之间分割。
  2. 当字符串为空时,split()返回一个包含一个空字符串的数组,而不是一个空数组,如果字符串和分隔符都是空字符串,则返回一个空数组。

注意: 如果分隔符是包含捕获括号的正则表达式,则每次分隔符匹配时,捕获括号的结果(包括任何未定义的结果)将被拼接到输出数组中。但是,并不是所有浏览器都支持此功能。

    var myString = "Hello 1 word. Sentence number 2.";
    var splits = myString.split(/(\d)/);
    console.log(splits);  // [ "Hello ", "1", " word. Sentence number ", "2", "." ]

5. RegExp.prototype.test

语法: regexObj.test(str)

返回值: 如果正则表达式与指定的字符串匹配 ,返回true;否则false。

6. RegExp.prototype.exec

语法: regexObj.exec(str)

返回值: 如果匹配成功,exec() 方法返回一个数组,并更新正则表达式对象的属性。返回的数组将完全匹配成功的文本作为第一项,将正则括号里匹配成功的作为数组填充到后面。 如果匹配失败,exec() 方法返回 null。

描述:

    var re = /quick\s(brown).+?(jumps)/ig;
    var result = re.exec('The Quick Brown Fox Jumps Over The Lazy Dog');
对象 对象/索引 描述 例子
result [0] 匹配的全部字符串 Quick Brown Fox Jumps
[1], ...[n ] 括号中的分组捕获 [1] = Brown [2] = Jumps
index 匹配到的字符位于原始字符串的基于0的索引值 4
input 原始字符串 The Quick Brown Fox Jumps Over The Lazy Dog
re lastIndex 下一次匹配开始的位置 25
ignoreCase 是否使用了 "i" 标记使正则匹配忽略大小写 true
global 是否使用了 "g" 标记来进行全局的匹配. true
multiline 是否使用了 "m" 标记使正则工作在多行模式(也就是,^ 和 $ 可以匹配字符串中每一行的开始和结束(行是由 \n 或 \r 分割的),而不只是整个输入字符串的最开始和最末尾处。) false
source 正则匹配的字符串 quick\s(brown).+?(jumps)

下表列出这个脚本的返回值:

对象 对象/索引 描述 例子
result [0] 匹配的全部字符串 Quick Brown Fox Jumps
[1], ...[n ] 括号中的分组捕获 [1] = Brown [2] = Jumps
index 匹配到的字符位于原始字符串的基于0的索引值 4
input 原始字符串 The Quick Brown Fox Jumps Over The Lazy Dog
re lastIndex 下一次匹配开始的位置 25
ignoreCase 是否使用了 "i" 标记使正则匹配忽略大小写 true
global 是否使用了 "g" 标记来进行全局的匹配. true
multiline 是否使用了 "m" 标记使正则工作在多行模式(也就是,^ 和 $ 可以匹配字符串中每一行的开始和结束(行是由 \n 或 \r 分割的),而不只是整个输入字符串的最开始和最末尾处。) false
source 正则匹配的字符串 quick\s(brown).+?(jumps)
    var myRe = /ab*/g;
    var str = 'abbcdefabh';
    var myArray;
    while ((myArray = myRe.exec(str)) !== null) {
        var msg = 'Found ' + myArray[0] + '. ';
        msg += 'Next match starts at ' + myRe.lastIndex;
        console.log(msg);
    }
result: 
    Found abb. Next match starts at 3
    Found ab. Next match starts at 9

总结

  1. 如果你只是为了判断是否匹配(true或 false),可以使用 RegExp.test() 方法,或者 String.search() 方法。
  2. 若想知道更多信息(然而执行比较慢),可使用exec() 方法(类似于 String.prototype.match() 方法)。 和 exec() (或者组合使用),一样,在相同的全局正则表达式实例上多次调用test将会越过之前的匹配。

你可能感兴趣的:(和正则相关的方法)