【问题标题】:How do I replace the last occurance of a variable in a string如何替换字符串中最后一次出现的变量
【发布时间】:2015-05-25 03:41:34
【问题描述】:

如何将字符串中最后出现的变量(foo)替换为“foo”?

我试过了:

    var re = new RegExp(".*" + (foo)));
    var newText = currentText.replace(re, someThingElse);

【问题讨论】:

标签: javascript regex


【解决方案1】:

如果再次出现针头,则进行负前瞻以使匹配失败

function replaceLast(haystack, needle, replacement) {
    // you may want to escape needle for the RegExp
    var re = new RegExp(needle + '(?![\\s\\S]*?' + needle + ')');
    return haystack.replace(re, replacement);
}

replaceLast('foobarfoo', 'foo', 'baz'); // "foobarbaz"
replaceLast('foobarfoo  \n  foobarfoo', 'foo', 'baz'); // "foobarfoo  \n  foobarbaz"
replaceLast('foo    ', 'foo', 'baz'); // "baz    "

这种方法的优点是替换正是你所期望的,即你可以像往常一样使用$1$2等,同样如果你传入一个函数参数也将是您所期望的

replaceLast('bar foobar baz', '(b)(a)(r)', '$3$2$1'); // "bar foorab baz"

【讨论】:

    【解决方案2】:

    负前瞻可以工作,但也可以

    newText = newText.replace(new RegExp("(.*)" + foo), "$1somethingElse");
    

    【讨论】:

    • 如果您不需要在替换中使用部分匹配,则使用贪婪的* 将比负前瞻更好。此外,.* 不会匹配新行
    • 这是否还会在我的原始字符串中添加回 foo 之后的文本?
    • @SuperUberDuper 在这种情况下是文本 before 被替换回
    猜你喜欢
    • 2011-04-19
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 2021-12-05
    • 1970-01-01
    相关资源
    最近更新 更多