String.prototype.split()
String.prototype.split()方法通过传入的参数符号,将一个字符串对象分割成一个字符串数组,这个传入的参数符号决定着字符串在什么位置进行分割。
var str = 'The quick brown fox jumps over the lazy dog.';
var words = str.split(' ');
console.log(words[3]);
// 输出: "fox"
var chars = str.split('');
console.log(chars[8]);
// 输出: "k"
var strCopy = str.split();
console.log(strCopy);
// 输出数组: ["The quick brown fox jumps over the lazy dog."]
语法
str.split([separator[, limit]])
注意!
如果调用split()函数时传入了空字符串str.split(“”),此时只能对属于UTF-16字符编码内的字符串进行分割成单字符,而如果字符串中有UTF-16以外的字符,例如unicode字符或一些生僻字,则不能正确分割字符。若需要分割unicode字符,需要使用正则表达式。"hello".split(""); //["h", "e", "l", "l", "o"] “????” .split(""); // ["�", "�", "�", "�", "�", "�", "�", "�"] //因为部分unicode字符在js中用两个字码表示 "????".split(/(?=.)/us); //["?", "?", "?", "?"] //?=表示“向前查找”或“先行断言”。 //us是ES6新增的正则修饰符,u-支持unicode字码,s-代表.可以匹配任意字符包括换行
参数
separator | 可选
该参数指定字符串在什么地方进行分割。separator参数可以是一个字符串或者一个正则表达式。如果separator是一个字符串,那在分割时必须完全匹配separator字符串才执行分割。如果separator参数没有传或者separator参数没有在被调用的字符串中匹配到,返回值将是一个包含整个被调用字符串的数组。如果separator参数是空字符串,split()函数将会把被调用字符串分割成一个个字符组成的数组。
limit | 可选
limit参数是一个整数,他决定了split()函数的分割次数。如果limit参数存在,返回的数组的数组长度将小于等于limit。如果在分割时还有未分割完的字符串,但是数组长度已经到达了limit的值,那么剩余的字符串将被丢弃,不会在结果中返回。
返回值
被调用的字符串每一次出现分割符的地方会被分割,最终拼成一个字符串数组返回。
描述
函数执行时,被调用字符串会把和separator参数相同的部分移除,并将移除部分前后的子字符串作为数组返回。如果separator参数没传(undefined)或者没有匹配到,返回的数组中就会包含一个整个被调用的字符串。如果separator是一个空字符串,被调用的字符串就会被分割成一个个字符组成的数组。如果separator在被调用字符串的头部、尾部或者头部和尾部都被匹配到了,那么返回的数组会在头部、尾部或者头部和尾部填充一个空字符串。如果separator等同于整个被调用的字符串,返回数组中会包含两个空字符串。
如果separator是一个包含捕获组的正则表达式,那么当每次匹配到separator时,其中的捕获组会被额外填充到返回数组中返回,也就是说捕获组不会被移除,而是作为单独的数组一项返回。
注意!
- 如果separator传入了一个数组,这个数组会被强制转换成字符串,执行String(separator)。
- 如果被调用的字符串是一个空字符串,但是separator不是空字符串,split()函数会返回一个包含一个空字符串的数组;如果被调用的字符串和separator都是空字符串,split()函数会返回一个空数组。
示例
使用String.prototype.split()函数
下面的示例程序展示了split()函数的常规用法,在splitString中打印出了调用时的相关信息:
function splitString(stringToSplit, separator) {
var arrayOfStrings = stringToSplit.split(separator);
console.log('The original string is: "' + stringToSplit + '"');
console.log('The separator is: "' + separator + '"');
console.log('The array has ' + arrayOfStrings.length + ' elements: ' + arrayOfStrings.join(' / '));
}
var tempestString = 'Oh brave new world that has such people in it.';
var monthString = 'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec';
var space = ' ';
var comma = ',';
splitString(tempestString, space);
splitString(tempestString);
splitString(monthString, comma);
程序输出如下:
The original string is: "Oh brave new world that has such people in it."
The separator is: " "
The array has 10 elements: Oh / brave / new / world / that / has / such / people / in / it.
The original string is: "Oh brave new world that has such people in it."
The separator is: "undefined"
The array has 1 elements: Oh brave new world that has such people in it.
The original string is: "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec"
The separator is: ","
The array has 12 elements: Jan / Feb / Mar / Apr / May / Jun / Jul / Aug / Sep / Oct / Nov / Dec
从一个字符串中移除空格
下面的例子中,split()函数将匹配出一个正则表达式:以任意个空格开始,随后跟一个分号或一个字符串结尾,再跟随一个任意空格。当找到这个匹配项后,移除整个匹配项:
var names = 'Harry Trump ;Fred Barney; Helen Rigby ; Bill Abel ;Chris Hand ';
console.log(names);
var re = /\s*(?:;|$)\s*/;
var nameList = names.split(re);
console.log(nameList);
对正则表达式进行分析,\s*表示任意个空格;(?:;| ) 是 一 个 捕 获 组 , 但 是 ? : 表 示 非 获 取 , 因 此 这 个 捕 获 组 最 终 会 被 移 除 。 捕 获 组 中 ; ∣ )是一个捕获组,但是?:表示非获取,因此这个捕获组最终会被移除。捕获组中;| )是一个捕获组,但是?:表示非获取,因此这个捕获组最终会被移除。捕获组中;∣表示一个分号或一个字符串结尾。最终程序输出如下:
Harry Trump ;Fred Barney; Helen Rigby ; Bill Abel ;Chris Hand
[ "Harry Trump", "Fred Barney", "Helen Rigby", "Bill Abel", "Chris Hand", "" ]
返回一个限制长度的结果
下面的例子中,在split()函数中传入3作为limit参数:
var myString = 'Hello World. How are you doing?';
var splits = myString.split(' ', 3);
console.log(splits);
最终输出如下:
["Hello", "World.", "How"]
使用正则表达式的捕获组功能,来保存部分分割符内容
如果separator是一个正则表达式,并且包含捕获组,那么这个捕获组会在结果中被返回:
var myString = 'Hello 1 word. Sentence number 2.';
var splits = myString.split(/(\d)/);
console.log(splits);
正则表达式中的捕获组将作为单独的一项数组项在返回值中出现:
[ "Hello ", "1", " word. Sentence number ", "2", "." ]
传入一个数组来分割
如果separator是一个数组,那么split()函数内部会先执行String(separator)将他转化为一个字符串:
var myString = 'this|is|a|Test';
var splits = myString.split(['|']);
console.log(splits); //["this", "is", "a", "Test"]
var myString = 'ca,bc,a,bca,bca,bc';
var splits = myString.split(['a','b']);
// myString.split(['a','b']) 等同于执行 myString.split(String(['a','b']))
console.log(splits); //["c", "c,", "c", "c", "c"]
使用split()函数反转字符串
注意,这种方式并不能在任何情况下都适用,对于unicode字符集就存在问题:
var str = 'asdfghjkl';
var strReverse = str.split('').reverse().join(''); // 'lkjhgfdsa'
// split() 返回的数组可以正好调用reverse()和join()
var str = 'résumé';
var strReverse = str.split(/(?:)/u).reverse().join('');
// 输出 "́emuśer"。注意这里的结果已经和输入的字符串发生了一些变化
如果想反转包含Unicode字符集的字符串,还是需要进行字码检查再进行反转,例如esrever这个小插件。