【问题标题】:jQuery replace string in matched stringjQuery替换匹配字符串中的字符串
【发布时间】:2014-08-26 18:07:10
【问题描述】:

我想替换正则表达式匹配的括号内的文本(第一组正则表达式)

换句话说,我尝试捕获像“[SomeText][1]”这样的字符串,并将其中的数字 1 替换为数字 2。下面的代码将所有字符串替换为我不想要的 2。

regex = new RegExp("\\[.*\\]\\[(1)\\]");
textarea.val().replace(regex, 2);

SomeText 正在发生变化。所以replace("[SomeText][1]", "[SomeText][2]") 不起作用。

【问题讨论】:

  • 为什么不直接textarea.val().replace(/\[1\]$/, '[2]');
  • 可以有多个[1],但不能有多个[SomeText][1]
  • 它只替换最后一个[1],因为有一个$

标签: jquery regex string


【解决方案1】:

JavaScript 中的 replace 方法允许您引用字符串中任何捕获的匹配项(使用括号捕获)。您将这些引用为第一个为 $1,第二个为 $2,以此类推,最高为 $9。您可以将其更改为以下内容,我相信您会得到您想要的:

regex = new RegExp("(\\[.*\\]\\[)1(\\])");
textarea.val().replace(regex, "$12$2");

【讨论】:

    【解决方案2】:

    如果您真的总是想用2 替换1,那么:

    var str = "[SomeText][1]";
    str = str.replace(/(\[[^\]]+\])(\[1\])/g, "$1[2]");
    console.log(str); // "[SomeText][2]"
    

    注意使用$1 重复前导位。 Live Example

    但更有趣的问题是 在第二个括号中的数字上加一,这可以通过给 replace 一个调用函数来完成:Live Example

    var str = "[SomeText][2]";
    str = str.replace(/(\[[^\]]+\])\[(\d+)\]/g, function(m, c1, c2) {
        return c1 + "[" + String(+c2 + 1) + "]";
    });
    console.log(str); // "[SomeText][3]"
    

    【讨论】:

      【解决方案3】:

      是的,必须有一些超级聪明的裤子方法来做到这一点,但这里有一个简单的建议:

      var bracketIdx = textarea.val().indexOf("[1]");
      var value = textarea.val();
      value[bracketIdx+1] = 2;
      textarea.val() = value;
      

      ...听起来你在做一些有点奇怪的事情,但如果你更详细地说明你想要完成的事情,我很乐意解释一个更好的方法。因为我写的小sn-p有点丑所以才问。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-13
        • 2016-08-27
        • 1970-01-01
        相关资源
        最近更新 更多