查找使用全局正则表达式时的替换次数

时间:2017-07-05 15:57:52

标签: javascript regex string

我有一个包含单词的句子(字符串)。我想用一个单词替换所有出现的单词。我使用newString = oldString.replace(/w1/gi, w2);,但现在我需要向用户报告我实际替换了多少个单词。

有没有一种快速的方法可以不借助:

  1. 一次更换一个单词并计数。
  2. 逐字比较oldStringnewString并计算差异? (简单的情况是如果oldString === newString => 0替换,但除此之外,我将不得不在两者上运行并进行比较。)
  3. 我可以在这里使用任何RegEx“技巧”,还是应该避免使用g标志?

2 个答案:

答案 0 :(得分:3)

选项1:使用replace回调

通过使用回调,您可以递增计数器,然后在回调中返回新单词,这允许您只遍历字符串一次,并实现计数。



var string = 'Hello, hello, hello, this is so awesome';
var count = 0;
string = string.replace(/hello/gi, function() {
  count++;
  return 'hi';
});

console.log('New string:', string);
console.log('Words replaced', count);




选项2:使用split join

同样使用split方法,而不是使用正则表达式,只需加入新单词即可创建新字符串。此解决方案允许您完全避免使用正则表达式来实现计数。



var string = 'Hello, hello, hello, this is so awesome';

string = string.split(/hello/i);
var count = string.length - 1;
string = string.join('Hi');

console.log('New string:', string);
console.log('Words replaced', count);




答案 1 :(得分:2)

您可以使用正在使用的正则表达式拆分字符串并获取长度。

var string = "The is the of the and the";
var newString = string.replace(/the/gi, "hello");

var wordsReplaced = string.split(/the/gi).length - 1;

console.log("Words replaced: ", wordsReplaced);

工作示例:

doSomething()