1

我需要计算字符串中数组的出现次数。我对特殊字符有疑问,例如;/()

var msg = "hello world :)"; 
var tce = [":)", ":(", ":/" ];
var countOcurrences = 0;
for (var i = 0; i < tce.length; i++) {
  res = msg.match(/tce[i]/g);
  if (res != null) countOcurrences += res.length;
}

我认为使用正则表达式可能会变得更容易。

4

4 回答 4

2

忘记使用正则表达式,只需使用简单indexOf的来检查出现次数。此功能将帮助您:

function countMatches(str, find) {
    var count = 0;
    var index = str.indexOf(find);
    while (index != -1) {
        count++;
        index = str.indexOf(find, index + 1);
    }
    return count;
}

您可以像这样使用它:

var msg = "hello world :)";
var tce = [":)", ":(", ":/"];
var countOcurrences = 0;
for (var i = 0; i < tce.length; i++) {
    countOcurrences += countMatches(msg, tce[i]);
}

这是一个工作示例

于 2013-11-06T11:05:10.457 回答
0

将数组值更改为:

var tce = [":\)", ":\(", ":/" ];

您需要在使用正()表达式时转义。

于 2013-11-06T10:58:57.420 回答
0

事实上,您根本不需要任何循环。只需使用替代项 ( |) 构造一个大的正则表达式并将字符串与之匹配:

var tce = [":)", ":(", ":/"];

// http://stackoverflow.com/a/3561711/989121
RegExp.escape= function(s) {
    return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')
}

var re = RegExp(tce.map(RegExp.escape).join('|'), "g");

var msg = "hello :/ world :):)";
var countOcurrences = (msg.match(re) || "").length; // 3
于 2013-11-06T11:02:54.747 回答
-1

不要使用正则表达式进行精确的字符串匹配。

您可以使用indexOf, 使用第二个参数offset来查找和计算所有出现的次数。

var pos = msg.indexOf(str);
if (pos === -1) {
    // no match
}
var last_pos = pos;

pos = msg.indexOf(str, last_pos + 1);
if (pos !== -1) {
    counter += 1;
}

基本上循环执行此操作^

于 2013-11-06T10:53:41.063 回答