【问题标题】:Javascript regex match number after string字符串后的Javascript正则表达式匹配数字
【发布时间】:2017-09-03 00:55:04
【问题描述】:

我有这个字符串

/results?radius=4000&newFilter=true

我需要将radius=4000 替换为radius=n,其中n 是一个变量。

如何使用String.replace() 方法和正则表达式来匹配该部分?

【问题讨论】:

标签: javascript regex


【解决方案1】:

您可以使用/radius=\d+/ 匹配“radius=”后跟任意位数。有了这个,我们可以使用replace() 方法将其替换为所需的值:

var str = "/results?radius=4000&newFilter=true";
var replacement = 123;

var newStr = str.replace(/radius=\d+/, "radius=" + replacement);

console.log(newStr);

【讨论】:

  • 匿名函数中的match参数以及该匿名函数本身都是不必要的。为什么不只是str.replace(/radius=\d+/, "radius=" + replacement)?此外,newStr 末尾缺少分号。
【解决方案2】:

应该很简单

var str='/results?radius=4000&newFilter=true';
var n = 1234;

str = str.replace(/(radius=)(\d+)/, "$1" + n);

【讨论】:

  • 如果可以避免,为什么要使用捕获组和反向引用?尤其是第二个捕获组似乎没有必要。
【解决方案3】:
var url = "/results?radius=4000&newFilter=true"; 
// or window.location.href for current url
var captured = /radius=([^&]+)/.exec(url)[1]; // your 4000
var newValue = 5000;
url = url.replace(captured, newValue);

通过这种方式,您也可以使用它来获取所有请求的参数 而且它不是十进制绑定的

【讨论】:

  • window.location.search.substr(1) 作为评论会更好。
  • @TimVermaelen 可能,必须以更快的速度进行基准测试
  • 我不认为它真的更快,只是在你想要匹配的部分更具表现力。如果'?不是问题,substr(1) 可以省略。
【解决方案4】:

如果你想获取所有参数,你可以试试这个:

function getParams(uri) {

	var params = {},
        tokens,
        re = /[?&]?([^=]+)=([^&]*)/g;
        
    while (tokens = re.exec(uri)) {
        params[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]);
    }
    return params;
}

var str='/results?radius=4000&newFilter=true';

str = str.substring(str.indexOf("?"));
params = getParams(str);

console.log(params);
console.log('radius => ', params['radius']);

这个答案来自这个帖子:How to get the value from the GET parameters?

【讨论】:

    【解决方案5】:

    带有正则表达式的 ES6 使用正向回溯

    const string       = '/results?radius=4000&newFilter=true',
          n            = '1234',
          changeRadius = (radius) => string.replace(/(?<=radius=)\d+/, n);
    
    console.log(changeRadius(n));
    /* Output console formatting */
    .as-console-wrapper { top: 0; }
    • changeRadius 是接受一个参数 (radius) 并执行替换的函数。
    • 关于正则表达式:\d+ 获取尽可能多的数字,(?&lt;=STRING)positive lookbehind

    其他正则表达式

    changeRadius() 函数的主体可以替换为string.replace(/radius=\d+/, 'radius=' + n)。它可能具有更好的性能,但原始正则表达式更直接地翻译了问题。

    【讨论】:

      【解决方案6】:

      您可以在不记住匹配项的情况下使用捕获来仅捕获 'radius=' 之后的数值。

      var url = "/results?radius=4000&newFilter=true";
      
      var radius = 123;
      
      var newUrl = url.replace(/(?:radius=){1}(\d+)/, radius);
      
      console.log(newUrl); // logs '/results?radius=4000&newFilter=true'0
      

      '

      【讨论】:

      • 第一件事,strreplacement 是未定义的。将url 更改为str,将radius 更改为replacement。第二件事,你在radius 之后错过了=。第三件事,你在replace()函数的第二个参数的位置忘记了replacement之前的'radius=' + 。第四件事,为什么不必要的{1}\d+ 周围的捕获组?最后一件事,我不知道你是否同意,但对我来说,积极的后视似乎更适合而不是非捕获组。
      • 感谢我修复了 str 和替换,实际上我在修改我的编辑器并粘贴了错误的脚本。
      • 这仍然给出"/results?123&amp;newFilter=true" 而不是/results?radius=123&amp;newFilter=true。再一次,你在replace() 函数的第二个参数的位置忘记了radius 之前的'radius=' +
      猜你喜欢
      • 2010-12-06
      • 2013-10-31
      • 2021-10-17
      • 1970-01-01
      • 2012-06-05
      • 2013-12-25
      • 1970-01-01
      相关资源
      最近更新 更多