zoukankan      html  css  js  c++  java
  • JavaScript正则表达式应用---replace()

    replace() 方法使用一个替换值(replacement)替换掉一个匹配模式(pattern)在原字符串中某些或所有的匹配项,并返回替换后的字符串。这个替换模式可以是字符串或者RegExp(正则表达式),替换值可以是一个字符串或者一个函数。

    语法

    str.replace(regexp|substr, newSubStr|function[, flags])
    

    参数

    • regexp:一个RegExp对象。该正则所匹配的内容会被第二个参数的返回值替换掉。
    • substr:一个要被 newSubStr 替换的字符串。
    • newSubStr:替换掉第一个参数在原字符串中的匹配部分。该字符串中可以内插一些特殊的变量名。
    • function:一个用来创建新子字符串的函数,该函数的返回值将替换掉第一个参数匹配到的结果。该函数的参数描述请参考 指定一个函数作为参数 小节。
    • flags:注意:flags 参数在 v8 内核(Chrome and NodeJs) 中不起作用。一个字符串指定正则表达式标志的组合。在 String.prototype.replace()方法中使用flags参数不是符合标准的并且不赞成这样做。使用一个带有相应标志(flags)RegExp对象来代替此参数。该参数的值应该是下面的一个或多个字符,具体作用见下:
    标签 描述
    g 全局匹配
    i 忽略大小写
    m 多行模式
    y sticky

    返回值

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

    描述

    该方法并不改变调用它的字符串本身,而只是返回替换后的字符串。

    在进行全局的搜索替换时,第一个参数要么时包含g标志的正则表达式,要么时包含g标志的字符串。

    使用字符串作为参数

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

    变量名 代表的值
    $$ 插入一个 "$"
    $& 插入匹配的子串。
    $` 插入当前匹配的子串左边的内容。
    $' 插入当前匹配的子串右边的内容。
    $n or $nn 假如第一个参数时RegExp对象,并且nnn是个十进制的数字,那么插入第n个括号匹配的字符串。

    指定一个函数作为参数

    你可以指定一个函数作为第二个参数。在这种情况下,当匹配执行后, 该函数就会执行。 函数的返回值作为替换字符串。(注意:上面提到的特殊替换参数在这里不能被使用。)另外要注意的是,如果第一个参数是正则表达式,并且其为全局匹配模式,那么这个方法将被多次调用,每次匹配都会被调用

    下面是该函数的参数:

    变量名 代表的值
    match 匹配的子串。(对应于上述的$&。)
    p1p2, ... 假如replace()方法的第一个参数是一个RegExp对象,则代表第n个括号匹配的字符串。(对应于上述的$1$2等。)
    offset 匹配到的子字符串在原字符串中的偏移量。(比如,如果原字符串是“abcd”,匹配到的子字符串时“bc”,那么这个参数将时1)
    string 被匹配的原字符串。(精确的参数个数依赖于replace()的第一个参数是否是一个正则表达式对象,以及这个正则表达式中指定了多少个括号子串。)

    下面的例子将会使newString变成'abc - 12345 - #$*%'

    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);
    

    示例

    在 replace() 中使用 global 和 ignore 选项

    下面的例子中,正则表达式包含有全局替换(g)和忽略大小写(i)的选项,这使得replace方法用'oranges'替换掉了所有出现的"apples"

    var re = /apples/gi;
    var str = "Apples are round, and apples are juicy.";
    var newstr = str.replace(re, "oranges");
    print(newstr);
    

    和上面的例子比起来,下面的例子中replace方法的第一个参数使用字符串而不是正则表达式,gi选项只能放在三个参数中。

    var str = "Apples are round, and apples are juicy.";
    var newstr = str.replace("apples", "oranges", "gi");
    print(newstr);
    

    这两个例子都打印出 "oranges are round, and oranges are juicy."

    在 replace()方法中使用正则直接量

    下面的例子中,replace()方法的第一个参数使用正则表达式直接量并且使用了i(忽略大小写)选项

    var str = "Twas the night before Xmas...";
    var newstr = str.replace(/xmas/i, "Christmas");
    print(newstr);  // Twas the night before Christmas...
    

    打印出 "Twas the night before Christmas..."

    交换字符串中的两个单词

    下面的例子演示了如何交换一个字符串中两个单词的位置,这个脚本使用$1$2 代替替换文本。

    var re = /(w+)s(w+)/;
    var str = "John Smith";
    var newstr = str.replace(re, "$2, $1");
    print(newstr);
    

    打印出 "Smith, John"

    使用一个函数来修改匹配到的字符。

    在这个例子中,所有出现的大写字母转换未小写,并且在匹配位置前加一个连字符。重要的是,在返回一个替换了的字符串前需要在匹配元素前需要进行添加操作。

    在返回前,替换函数允许匹配片段作为参数,并且将它和连字符进行连接作为新的片段。

    function styleHyphenFormat(propertyName) {
        function upperToHyphenLower(match) {
            return '-' + match.toLowerCase();
        }
        return propertyName.replace(/[A-Z]/g, upperToHyphenLower);
    }
    

    此代码 styleHyphenFormat('borderTop')将返回 'border-top'

    因为我们想在最终的替换中进一步转变匹配结果,所以我们必须使用一个函数。这迫使我们在使用toLowerCase()方法前进行评估。如果我们尝试不用一个函数进行匹配,那么使用toLowerCase() 方法将不会有效。

    var newString = propertyName.replace(/[A-Z]/, '-' + '$&'.toLowerCase());  // won't work
    
    

    这是因为'$&'.toLowerCase()首先作为一个字符串(导致相同的'$&')之前使用字符作为模式。

    将华氏温度转换为对等的摄氏温度

    下面的例子演示如何将华氏温度转换为对等的摄氏温度。华氏温度用一个数字加一个"F"来表示,这个函数将返回一个数字加"C"来表示的摄氏温度。例如,如果输入是212F,这个函数将返回100C。如果输入数字时0F,这个方法将返回"-17.77777777777778C"

    正则表达式test检查任何数字是否以F结尾。华氏温度通过第二个参数p1进入函数。这个函数基于华氏温度作为字符串传递给f2c函数设置成摄氏温度。然后f2c()返回摄氏温度。这个函数与Perls///e 标志相似。

    function f2c(x) {
        function convert(match, p1, offset, s) {
            return ((p1-32) * 5/9) + "C";
        }
        var test = /(d+(?:.d*)?)F/g;
        return x.replace(test, convert);
    }
    

    数字转为千分位

    数字千分位就是将数字三个一分,如1234567890转为1,234,567,890

    var str = "1234567890";
    str.replace(/d{1,3}(?=(d{3})+$)/g, function(match) {
        return match + ',';
    });
    

    详简:正则表达式/d{1,3}(?=(d{3})+$)/g中的d表示匹配数字,{1,3}表示匹配1到3次,d{1,3}表示匹配连续的1到3个数字,d{3}匹配连续的三个数字,(?=)表示反向匹配,即为从后向前匹配,(?=(d{3})+$)就表示从后向前三位数字一匹配,至少匹配一次,而最前面必须有1到3个数字,即第一次的d{1,3},最后的参数g表示全局匹配,匹配完所有。

    下面在回调函数中多添加几个参数。

    var str = "1234567890";
    str.replace(/d{1,3}(?=(d{3})+$)/g, function(match, p1, offset, string) {
        //return s+',';
        console.log(match, p1, offset, string);
    });
    

    matchd{1,3}匹配到的字符串,p1(d{3})每次匹配到的字符串,offsetmatch的起始位置(从0开始),string始终为原始字符串。
    输出结果如下:

    1 890 0 1234567890
    234 890 1 1234567890
    567 890 4 1234567890
    

    参考

    以上文章多数拷贝于replace(),本人也翻译了一部分,有什么错误及理解不当的地方还望指正!

  • 相关阅读:
    bzoj 1188 [HNOI2007]分裂游戏(SG函数,博弈)
    poj 3710 Christmas Game(树上的删边游戏)
    poj 1704 Georgia and Bob(阶梯博弈)
    110 最小路径和
    109 数字三角形
    63 搜索旋转排序数组II
    62 搜索旋转排序数组
    61 搜索区间
    58 四数之和
    关于初始值的问题
  • 原文地址:https://www.cnblogs.com/snowsolf/p/js_replace.html
Copyright © 2011-2022 走看看