在之前的文章《js怎么知道给定子串是不是存在》中,我们介绍了通过获取子串在字符串的第一次或最后一次出现位置的方法。这次我们加大难度,看看如何获取子串在字符串的所有出现位置。
我们在之前的文章中了解到使用indexOf()和lastIndexOf()函数可以获取子串在第一次出现位置和最后一次出现位置;如果没有找到该子串,则返回-1。
而这两个函数都可接收可选的第二个参数start
,值只能是一个整数,表示从字符串中的哪个位置开始搜索,取值范围是 0
~ length-1
。lastIndexOf()如果指定了start参数,则在一个字符串中的指定位置从后向前搜索。
利用这个可选的第二个参数start和循环语句,我们就可以计算给定子串(包含一个或多个字符)的全部出现位置。
首先看看使用indexOf()是怎么统计给定字符在字符串的所有出现位置
var stringValue = "Lorem ipsum dolor sit amet, consectetur adipisicing elit"; var positions = new Array(); var pos = stringValue.indexOf("e"); while(pos > -1){ positions.push(pos); //将出现位置赋给数组 pos = stringValue.indexOf("e",pos + 1); //从给定字符出现位置的后一位开始查找 } console.log(positions);//"3,24,32,35,52"
分析:先使用indexOf("e")
获取第一次出现位置并赋值给变量pos;然后使用while语句通过循环调用indexOf(),不断将查找起始位置设置为“pos + 1
”,从给定字符出现位置pos的后一位开始查找,获取下一个出现位置;直到查找不到,返回-1结束。因此输出结果为:
可以看出,给定字符“e
”在字符串stringValue中一个出现了5次,因为字符串位置起始于 0,而不是 1,所以出现位置分别为3、24、32、35、52。
然后我们来看看使用lastIndexOf()是怎么统计给定字符在字符串的所有出现位置
var stringValue = "Lorem ipsum dolor sit amet, consectetur adipisicing elit"; var positions = new Array(); var pos = stringValue.lastIndexOf("e"); while(pos > -1){ positions.push(pos); pos = stringValue.lastIndexOf("e",pos - 1); } console.log(positions);//"3,24,32,35,52"
分析:使用lastIndexOf()获取所有出现位置其实和使用indexOf()差不多,只不过因为lastIndexOf()返回的是最后一次的出现位置,所以,每次循环,我们都要将查找的起始位置设置为“pos – 1”。
看看输出结果:
可以看出,获取到的给定字符“e”在字符串stringValue中所有出现位置是倒序的,顺序分别为:52、35、32、24、3。
好了,就说到这里了,有需要的可以看:javascript高级教程