我有一个字符串如下
我想计算 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。 有人可以指点我该怎么做才能将两者都算作单独的单词吗?
答案 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);