2016-10-01 133 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'),那么鉴于它的目的和历史,你真的可以责怪它吗? –