动态RegExp,在JavaScript中保存案例

时间:2015-07-18 23:14:04

标签: javascript regex replace

我要做的是编写一个函数来替换给定句子中的单个单词。其中一个要求是,替换单词的大小写将与原始单词一起保留。

我写了以下函数:

function replace(str, before, after) {
  var re = new RegExp('(\\.*)?(' + before + ')(\\.*)?', 'i');
  return str.replace(re, after);
}


// DEBUG
console.log('----- DEBUG START -----');

var tasks = [
  replace("A quick brown fox jumped over the lazy dog", "jumped", "leaped"),
  replace("Let us go to the store", "store", "mall"),
  replace("He is Sleeping on the couch", "Sleeping", "sitting"),
  replace("This has a spellngi error", "spellngi", "spelling"),
  replace("His name is Tom", "Tom", "john"),
  replace("Let us get back to more Coding", "Coding", "bonfires"),
];

for (var i = 0; i < tasks.length; i++) {
  console.log('Result #' + i + ': ' + tasks[i]);
}

console.log('----- DEBUG END -----');

after字的情况与before字的情况不同外,一切正常。

信息:

我使用数组解决了同样的问题(使用split()splice()indexOf())并仅使用非动态before替换RegExp()元素案件得以保留。这就是为什么我不太明白为什么我的其他解决方案不起作用的原因。

1 个答案:

答案 0 :(得分:3)

您正在用另一个字符串替换字符串。 JS不会神奇地将原始单词的大小写应用于替换单词,因为这可能导致潜在的不良行为。如果你必须保留角色的情况,你需要尽力去做。

如果您只关心第一个字母的大小写,您可以在replace函数中执行以下操作:

function replace(str, before, after) {
  var b0 = before[0];
  after = after.replace(/^(.)/, function(a0){
    return b0.toUpperCase() === b0 ? a0.toUpperCase() : a0.toLowerCase();
  });
  var re = new RegExp('(\\.*)?(' + before + ')(\\.*)?', 'i');
  return str.replace(re, after);
}

// DEBUG
document.write('----- DEBUG START -----<br>');

var tasks = [
  replace("A quick brown fox jumped over the lazy dog", "jumped", "leaped"),
  replace("Let us go to the store", "store", "mall"),
  replace("He is Sleeping on the couch", "Sleeping", "sitting"),
  replace("This has a spellngi error", "spellngi", "spelling"),
  replace("His name is Tom", "Tom", "john"),
  replace("Let us get back to more Coding", "Coding", "bonfires"),
];

  for (var i = 0; i < tasks.length; i++) {
  document.write('Result #' + i + ': ' + tasks[i]+'<br>');
}

document.write('----- DEBUG END -----');