这里以获取‘hello’字符串的第二个字符为例,首先我们定义一个变量: let str = 'hello'

方法一(字符串函数直接截取):

ios截取指定字符以后的字符串 截取字符串到指定字符_数组

 这是最常规的方法,这三个函数可以截取字符串,但又有所不同。slice 和substring 的第一入参和第二入参表示截取的起始位置和结束位置,但是slice的入参允许为负,例如str.slice(-2,-1)代表截取str的倒数第二位字符。而substr的第一入参和第二入参表示截取的起始位置和截取的长度。大家尽量避免使用substr了,因为这个并非标准。

ios截取指定字符以后的字符串 截取字符串到指定字符_ios截取指定字符以后的字符串_02

方法二(字符串可遍历特性):

字符串具有Iterator 接口,可以被for...of 循环遍历,所以也可以通过数组下标访问的形式获取指定下标的值。如str[1]就是本文的结果

ios截取指定字符以后的字符串 截取字符串到指定字符_字符串截取_03

方法三(解构赋值):

这里主要还是利用了字符串的数组特性,其次才是es6中解构赋值的写法,其中解构赋值的本质就是一个模式匹配,同时他允许左侧的其中一个模式匹配为空,所以我们才能拿到指定位置的字符。这种方式不推荐实际使用,只是展示一下有这种方法而已。以及说明一下解构的特点。

ios截取指定字符以后的字符串 截取字符串到指定字符_ios截取指定字符以后的字符串_04

 方法四(正则匹配中的子匹配项$1,$2......):

正则表达式在exec执行的时候,其中的子匹配表达式(用中括号包起来的就是子匹配表达式)的值会根据他们出现在正则表达式中的顺序分别赋值给RegExp的$1,$2...以此类推

ios截取指定字符以后的字符串 截取字符串到指定字符_字符串截取_05

 方法五(正则匹配match结果):

字符串有match方法,结果是一个匹配的数组,RegExp实例的exec方法也返回了一个数组,其中数组中的第一个值表示整个正则表达式匹配的值,数组中的第二个值表示第一个子匹配表达式匹配的值,数组中的第三个值表示第二个子匹配表达式匹配的值,以此类推

ios截取指定字符以后的字符串 截取字符串到指定字符_js_06

方法六(正则具名匹配):

这和解构赋值一样是es6的新特性。这个相当于手动将子匹配表达式匹配到的值赋值给了一个你指定的变量上,而不再是RegExp上的$1,$2....上。注意写法就行: (?<var>), 你的所有具名项都会被添加到groups中,如果配合解构赋值,取值方式会更具可读性。

ios截取指定字符以后的字符串 截取字符串到指定字符_ios截取指定字符以后的字符串_07

 

ios截取指定字符以后的字符串 截取字符串到指定字符_字符串_08

小结:

在上面几种方法中,方法二(字符串可遍历特性)是最简单的,毕竟取值方式和数组一样,也是最容操作的。方法一(字符串函数直接截取)和 方法六(正则具名匹配)也不错,这两种方法对于字符串获取任意位置的字符可以有更好的应变性。方法一只需要改变截取起始位置和结束位置就行,方法六只需要改变一下正则表达式就可以,例如现在我们需要获取‘hello’的第三个字符正则表达式如下: /.{2}(?<third>.)/。对于任何字符串的截取问题正则匹配都是可以做到的,同时$1,$2....的存在又给获取子匹配表达式的匹配值提供了捷径。

ios截取指定字符以后的字符串 截取字符串到指定字符_字符串_09

 其余的方法只是提供了一种取值的可能性。如果后期出现新的方法,本文还会持续更新。零散的知识比较容易被遗忘,如果能通过某种方式(例如本文通过一个简单的小问题汇总不同知识点)组织成一颗知识树,那么你的技术累积会比较耐磨。学也无涯,唯上下而求索。