Javascript 在字符串末尾计算匹配项

Javascript 在字符串末尾计算匹配项,javascript,Javascript,我想计算字符串末尾出现的字符串数。我希望它忽略不在末尾的事件,如果没有,我希望它返回零 要查找的终端字符串:-1 e.g. string = 1 // 0 e.g. string = 1-1 // 1 e.g. string = 1-1-1 // 2 e.g. string = 1-2-1 // 1 e.g. string = 1-2-1-2-1 // 1 e.g. string = 2-1-1-1-1 // 4 e.g. string = 1-1-2 // 0 我希望它计算字符串末尾的所有事

我想计算字符串末尾出现的字符串数。我希望它忽略不在末尾的事件,如果没有,我希望它返回零

要查找的终端字符串:-1

e.g. string = 1
// 0
e.g. string = 1-1
// 1
e.g. string = 1-1-1
// 2
e.g. string = 1-2-1
// 1
e.g. string = 1-2-1-2-1
// 1
e.g. string = 2-1-1-1-1
// 4
e.g. string = 1-1-2
// 0
我希望它计算字符串末尾的所有事件,而不仅仅是字符串中任何地方的事件

我试过:

var occurrences = string.match(/(-1)*$/).length;
我这里有一把JS小提琴:

无论我的字符串是什么,它都返回2。

非正则表达式版本:

var occurences = 0;
string.split("-1").reduceRight((exit, space) => {
  if(exit || space) return true;
  occurences++;
  return false;
}, false);
非正则表达式版本:

var occurences = 0;
string.split("-1").reduceRight((exit, space) => {
  if(exit || space) return true;
  occurences++;
  return false;
}, false);

倒着走数数

变量字符串=2-1-1-1-1; var find=-1; var匹配=0; 对于var i=string.length;i>=0;i-=find.length{ 如果string.substri-find.length,则find.length==find match++; 其他的 打破 }
console.log=+match向后走并计数

变量字符串=2-1-1-1-1; var find=-1; var匹配=0; 对于var i=string.length;i>=0;i-=find.length{ 如果string.substri-find.length,则find.length==find match++; 其他的 打破 }
console.log=+match试试这个。这对于所有测试值都正常运行

函数countOnesAtTheEnds{ var数组=s.split-; var计数=0;
forvar i=1;i试试这个。对于所有测试值,这个运行正常

函数countOnesAtTheEnds{ var数组=s.split-; var计数=0;
forvar i=1;i您需要处理返回数组的第一个元素:

string.match(/(-1)*$/)[0].length/2
找到第一个元素的长度,该元素在末尾是匹配的字符串-1,并除以2,因为字符串-1的长度为2

引用MDN的话:

返回值

如果字符串与表达式匹配,它将返回一个数组 包含整个匹配字符串作为第一个元素,后跟 括号中捕获的任何结果。如果没有匹配项,则为null 返回

函数计数{ console.logstring.match/-1*$/[0]。长度/2 } 变量字符串=1 // 0 计数 字符串=1-1 // 1 计数 字符串=1-1-1 // 2 计数 字符串=1-2-1 // 1 计数 字符串=1-2-1-2-1 // 1 计数 字符串=2-1-1-1-1 // 4 计数 字符串=1-1-2 // 0
count;您需要处理返回数组的第一个元素:

string.match(/(-1)*$/)[0].length/2
找到第一个元素的长度,该元素在末尾是匹配的字符串-1,并除以2,因为字符串-1的长度为2

引用MDN的话:

返回值

如果字符串与表达式匹配,它将返回一个数组 包含整个匹配字符串作为第一个元素,后跟 括号中捕获的任何结果。如果没有匹配项,则为null 返回

函数计数{ console.logstring.match/-1*$/[0]。长度/2 } 变量字符串=1 // 0 计数 字符串=1-1 // 1 计数 字符串=1-1-1 // 2 计数 字符串=1-2-1 // 1 计数 字符串=1-2-1-2-1 // 1 计数 字符串=2-1-1-1-1 // 4 计数 字符串=1-1-2 // 0
count;使用Stringmatch查找到达末尾的-1链,然后按-1拆分,得到长度-1。拆分-1-1-1字符串时,将得到一个包含四项的数组。现在我们可以提取长度,并将其减少一项

函数mstr{ 返回str.match/-1*$/g[0].split-1.length-1; } console.logm'1'//0 console.logm'1-1'//1 console.logm'1-1-1'//2 console.logm'1-2-1'//1 console.logm'1-2-1-2-1'//1 console.logm'2-1-1-1'/4
console.logm'1-1-2'//0使用Stringmatch查找到达末尾的-1链,然后按-1拆分,得到长度-1。拆分-1-1字符串时,将得到一个包含四项的数组。现在我们可以提取长度,并将其减少一项

函数mstr{ 返回str.match/-1*$/g[0].split-1.length-1; } console.logm'1'//0 console.logm'1-1'//1 console.logm'1-1-1'//2 console.logm'1-2-1'//1 console.logm'1-2-1-2-1'//1 console.logm'2-1-1-1'/4
console.logm'1-1-2'//0您得到的结果是什么?我猜1-1-1的结果是4,而不是2,因为您使用的是字符串长度,而不是计算令牌的数量。无论我使用什么字符串,我的JSFIDLE都会返回2。这是因为match返回一个数组,该数组始终包含2个元素,匹配的字符串和分组运算符在括号中Regex您得到的结果是什么?我猜1-1-1的结果是4,而不是2,因为您使用的是字符串长度,而不是计算令牌的数量。无论我使用什么字符串,我的JSFIDLE都会返回2。这是因为match返回一个数组,该数组始终包含2个元素,匹配的字符串和分组运算符在regexI单击的括号内你的链接。它没有给出正确的结果。它应该只计算结尾处的结果。我单击了你的链接。它没有给出正确的结果。它应该只计算结尾处的结果。你能再了解一下代码结尾处的工作吗:'.split-1.length-1?这也很有效。我选择上面的一个作为我的解决方案这是因为它解释了匹配的工作原理,包括我们为什么需要匹配[0]。您也清楚地了解它,而且此解决方案似乎同样有用。很难选择
“在两者之间。”托马斯——你选择得很好。我喜欢他的解决方案:你能再多了解一下这段代码的结尾在做什么吗?'.split-1.length-1?这也很有效。我选择上面的一个作为我的解决方案,因为它解释了match是如何工作的,包括我们为什么需要match[0]。您也很清楚这一点,这个解决方案似乎同样有用。很难在两者之间做出选择。@Thomas-你选择得很好。我喜欢他的解决方案:阅读此问题的人必须了解匹配的工作方式、查看正确长度匹配[0]的必要性以及字符串长度的影响。感谢您的帮助,并感谢您关注真正的问题。阅读此问题的人必须了解匹配的工作方式、查看正确长度匹配[0]的必要性以及我的字符串长度的影响。谢谢你的帮助,也谢谢你关注真正的问题。