JavaScript中String的split方法详解

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这个小插件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值