天天看點

JavaScript中String的split方法詳解String.prototype.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這個小插件。

繼續閱讀