我试图在某些特定的字符上拆分表达式。我知道我们可以使用带有正则表达式的String.split(),所以这是我的第一个猜测:
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'只匹配'。感谢。
答案 0 :(得分:1)
没有" JS典型的奇怪"继续这里 - 这是所有记录的行为。如果你想抱怨JS奇怪,那你在派对上有点晚了......几年前,随着JavaScript的成长,它已经过时了。"
来自String#split
的文档:
如果separator是包含捕获括号的正则表达式,则每次匹配时,捕获括号的结果(包括任何未定义的结果)都会拼接到输出数组中。但是,并非所有浏览器都支持此功能。
由于您正在使用分组运算符,因此您将在结果中获取分割标记以及正在分割的内容。如果删除拆分标记,它的行为与您最初预期的一样:
// old: /([ (),;.]+)/g;
let regex = /[ (),;.]+/g;