2016-10-01 92 views
0

我想分割一些特定的字符表達式。我知道我們可以用正則表達式使用String.split(),所以這是我第一次的猜測:用正則表達式分割JS字符串

function expressionSplit([input]) { 
 
    let regex = /([(),;.]+)/g; 
 
    let arr = input.split(regex); 
 

 
    arr.forEach(item => console.log('item: ' + item)); 
 
} 
 

 
expressionSplit(['let sum = 1 + 2;if(sum > 2){\tconsole.log(sum);}']);

現在,這是遠不及我所期待的,所以我做了一些更多的閱讀和發現與我不同,人們使用split()和正則表達式沒有問題。不解,我嘗試這樣做:

function expressionSplit([input]) { 
 
    let regex = /([(),;.]+)/g; 
 
    let arr = input.replace(regex, '|').split('|'); 
 

 
    arr.forEach(item => console.log('item: ' + item)); 
 
} 
 

 
expressionSplit(['let sum = 1 + 2;if(sum > 2){\tconsole.log(sum);}']);

出乎我的意料 - 它的工作居多。爲什麼會發生?我認爲這是一種JS典型的奇怪現象,因爲它對我來說根本沒有意義,另外,正如我所說 - 其他人似乎使用split()與正則表達式沒有任何問題。另外我怎樣才能分裂'\ T'(選項卡)。給正則表達式添加'\ t'似乎什麼都不做,'\\ t'只匹配't'。謝謝。

回答

1

在這裏沒有「JS典型的怪異」 - 這是所有記錄的行爲。如果你想抱怨JS的古怪,那麼你對派對有點遲到......多年前,隨着JavaScript「長大」,它已經過時了。

String#split文檔:

如果分離器是一個包含捕獲括號,則每次分離器匹配時,捕獲括號的結果(包括任何未定義的結果)被拼接成一個正則表達式輸出數組。但是,並非所有瀏覽器都支持此功能。

由於您使用的是分組操作符,因此您會在結果中獲取分割標記以及正在分割的內容。如果刪除拆分令牌,它的行爲與您最初預期的相同:

// old:  /([(),;.]+)/g; 
let regex = /[(),;.]+/g; 
+0

感謝您的答案 - 它的工作原理。我沒有抱怨,我對JS沒有任何意義,所以你不必去防守:D。但是你不能否認像JS那樣靈活 - 與你的標準編程語言相比,它有一些非常有趣的,即使不是奇怪的特徵。 – Alex

+0

對不起,要防守。 JavaScript一直是一個出氣筒,我只是略過它而已。我不同意JavaScript比其他語言具有更特殊的「怪癖」。每種語言都有它的奇怪,制度化的特質 –

+0

完全披露:我也曾經是一個「仇敵」。但那是在我真正瞭解這門語言之前。如果JavaScript在向後兼容性方面存在錯誤(我在看着你,'typeof'),那麼鑑於它的目的和歷史,你真的可以責怪它嗎? –