【问题标题】:Javascript replace character in regular expression in matched groupJavascript替换匹配组中正则表达式中的字符
【发布时间】:2021-07-29 05:03:29
【问题描述】:

我正在尝试在正则表达式中捕获匹配组,在该正则表达式内部,在该匹配组内部,我需要替换一个字符并复制匹配项。比如

foo-bar-baz

我需要做/foo-(\w+)-baz/,但我想将匹配组中的所有“r”替换为“t”并复制它,就像

foo-barbat-baz

同一字符串中可能有多个匹配项,因此 test-string-foo-bar-baz-another-foo-bar-baz 将变为 test-string-foo-barbat-baz-another-foo-barbat-baz

我知道我可以在 .replace 中使用 $1 .. 等,但这不能处理任意数量的匹配。我也知道\n(例如\1)和\k,但这些似乎都没有帮助。

我试过循环遍历匹配,但我不知道如何判断字符串中的匹配位置,所以我可以在它之后“插入”替换,然后一旦我替换它,字符串长度会发生变化,因此下一个匹配位置将不正确。

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    您可以在.replace 中使用这种 lambda 方法:

    const s = 'test-string-foo-bar-baz-another-foo-bar-baz';
    
    var repl = s.replace(/(foo-)(\w+)(-baz)/g,
        (m, g1, g2, g3) => g1 + g2 + g2.replace(/r/g, "t") + g3);
    
    console.log(repl);

    RegEx/lamnda 详细信息:

    • (foo-)(\w+)(-baz):使用 3 个捕获组捕获第一组中的 foo-、第二组中的 \w+ 和第三组中的 -baz
    • (m, g1, g2, g3):使 m(完全匹配)和 gN(第 N 个捕获组)可用于 lambda 表达式
    • g1 + g2 + g2.replace(/r/g, "t") + g3:在复制g2 时连接g1 + g2 + g3,将r 替换为t

    【讨论】:

    • 很好,在没有 s 参数的情况下也可以替换
    • 我正在努力,你可以想象这不是我的情况,但我正在修改我的复杂重新,看看我是否可以通过任意数量的匹配来完成此操作
    • as you can imagine this isn't quite my case:对不起,我没听懂你的意思。这确实符合您的预期输出,并且完全符合您的要求。请澄清什么不适合你?
    • 抱歉,这正是我所要求的。我的意思是我需要让它适应我的代码,并找出我的正则表达式,因为我不是真的在搜索“foo-bar-baz”而是复杂的字符串。我昨晚搞定了,谢谢你的帮助。
    • 很高兴知道你已经成功了,但请理解答案只能解决一个陈述的问题,而不是任何地方都没有提到的问题。
    猜你喜欢
    • 2015-01-04
    • 1970-01-01
    • 2015-11-30
    • 2022-12-01
    • 1970-01-01
    • 2014-10-22
    • 2011-04-05
    相关资源
    最近更新 更多