计算字符串中特定单词的出现次数

时间:2018-10-28 06:10:45

标签: javascript regex split

我有一个字符串如下

我想计算 v | adv | 的总数。我正在使用下面的代码行

var result = "coord|and adv|then pro|it mod|may v|hurt det|the n|dog";
console.log(
  (result.split("v|").length - 1) + (result.split("adv|").length - 1)
);

从技术上讲,现在应为2,即adv |为1 |和1代表v |但实际上是在计算v |在adv |中同样,结果是3。 有人可以指点我该怎么做才能将两者都算作单独的单词吗?

3 个答案:

答案 0 :(得分:4)

对于v部分,您可以有两个字母组成的一组,它们不是ad,以确保它与adv|不匹配:

var result = "coord|and adv|then pro|it mod|may v|hurt det|the n|dog";
console.log(
  (result.split(/(?:(?!ad)..|^.?)v\|/).length-1) +
  (result.split("adv|").length-1)
);

https://regex101.com/r/f80iGd/1

/(?:(?!ad)..|^.?)v\|/的意思是:

(?:(?!ad)..|^.?)-包含以下任意一项的组:

(?!ad)..-两个不是ad的字母,或者

^.?-字符串的开头,或字符串的开头,后跟一个字母

以上所有内容后跟v\|v和文字|

此外,与其使用split来构造一个拆分的数组,然后检查数组的长度减去一个长度,不如使用match来匹配v|的出现,可能更直观或adv|,然后检查匹配数:

var result = "coord|and adv|then pro|it mod|may v|hurt det|the n|dog";
console.log(
  result.match(/(?:(?!ad)..|^.?)v\|/g).length +
  result.match(/adv\|/g).length
);

请注意,在较新的Javascript环境中,您还可以使用负向后看来检查v之前是否没有ad

var result = "coord|and adv|then pro|it mod|may v|hurt det|the n|dog";
console.log(
  result.match(/(?<!ad)v\|/g).length +
  result.match(/adv\|/g).length
);

(以上代码段可能不适用于所有浏览器)

您还可以通过使用.match的可选组将两个ad条件合并为一个:

var result = "coord|and adv|then pro|it mod|may v|hurt det|the n|dog";
console.log(
  result.match(/(?:ad)?v\|/g).length
);

答案 1 :(得分:1)

要防止匹配“从单词的中间”开始,请在{ 正则表达式的开始(不幸的是,JavaScript的正则表达式风格不 包含lookbehind),并将其作为正则表达式(\b)而不是字符串传递 (/.../

还要注意,"..."的参数是一个正则表达式,在正则表达式split中 具有特殊含义(替代分隔符)。 要从字面上匹配|,请在其前面加上|

因此,第一个正则表达式应为:\,第二个为/\bv\|/

答案 2 :(得分:0)

您可以简单地先取出adv|,然后再加工v|。因为adv|v|的超集。

var result = "coord|and adv|then pro|it mod|may v|hurt det|the n|dog";

const advSeparated = result.split("adv|");

const totalCount = advSeparated.reduce((acc, string) =>
  acc + (string.split('v|').length - 1)
, advSeparated.length - 1)


console.log(totalCount);