如何仅替换模式的一部分?

时间:2018-08-06 14:27:27

标签: javascript regex replace

我有以下字符串:

var hashString = "model,5;month,10;year,2018";

document.write(hashString);

模式为 paramName1,valueName1; paramName2,valueName2; paramName3,valueName3 ,依此类推,添加所需的名称/值对。

我需要更改paramNameX的valueNameX。与正则表达式一起尝试;我对他们不太满意。结束定界符为;还是“空”?开始?

尝试过this

var hashString = "model,5;month,10;year,2018";

paramName = "month,";
paramValue = 8;
hashString = hashString.replace(/paramName.*;/g, paramValue);

document.write(hashString);

但没有成功。

3 个答案:

答案 0 :(得分:2)

您可以不使用regex来执行此操作。

步骤:

  • split您来自;的字符串,您将获得一个数组。
  • map遍历数组的每个字符串,并检查其是否includes paramName 。如果确实返回paramName + paramValue,则返回相同的字符串。
  • join返回字符串数组,同时保持;作为分隔符,您将获得预期的输出。

var hashString = "model,5;month,10;year,2018";

var paramValueReplacer = (paramName, paramValue, str) => str.split(";")
                       .map(s => s.includes(paramName) ? paramValue ? (paramName + paramValue) : "" : s)
                       .filter(s => !!s)
                       .join(";")

var paramName1 = "month,";
var paramValue1 = 8;

console.log(paramValueReplacer(paramName1, paramValue1, hashString))

var paramName2 = "month,";
var paramValue2 = "";

console.log(paramValueReplacer(paramName2, paramValue2, hashString))

答案 1 :(得分:0)

要确切回答您的问题,要将参数传递到正则表达式中,应使用onRemoveRow(selected),然后将创建的实例传递给new RegExp()。换句话说,RegExp()接受字符串作为参数(或其他正则表达式),replace()接受RegExp实例作为参数。

replace()

无论哪种方式,我认为最好的方法是创建一个这样的对象:

var hashString = "model,5;month,10;year,2018";


var param = "month,";
var regex = new RegExp("(" + param + ")[0-9]*", "g");
paramValue = 8;
hashString = hashString.replace(regex, "$1" + paramValue);

console.log(hashString);

如果要泛泛使用:

var hashString = "model,5;month,10;year,2018";

var obj = {};

hashString.split(";").map(o => {
  var el = o.split(",");
  obj[el[0]] = el[1];
})

obj.month = 8
console.log(obj)

答案 2 :(得分:0)

您不能在正则表达式对象文字//中直接使用变量:

尝试

paramValue = 8;
hashString = hashString.replace(new RegExp("("+paramName+")[^;]+",'g'), "$1"+paramValue);
  • [^;]除了;
  • $1 paramName是用()捕获的