我已经使用.split()数十次将字符串转换为数组。这是我第一次收到意外结果。这里,split返回一个空字符串数组。这很奇怪,因为字符串中没有空格被拆分。
是否有正则表达式方法可以避免这种新的意外结果,或者只需要用新的代码行删除它们?
let infix = "(A+B)*C";
let infixArr = infix.split(/(\W)/g);
console.log(infixArr);
Yields -- > [ '', '(', 'A', '+', 'B', ')', '', '*', 'C' ]
Expected --> [ '(', 'A', '+', 'B', ')', '*', 'C' ]
答案 0 :(得分:3)
问题是彼此相邻有多个分隔符,因此它们之间的字符串为空。您可以使用filter
过滤空字符串:
"(A+B)*C".split(/(\W)/g).filter(c => c !== '');
//=> ["(", "A", "+", "B", ")", "*", "C"]
答案 1 :(得分:2)
出现空字符串,因为\W
正在拆分任何非单词字符,其中包括括号:第一个是分隔空字符串和A.第二个字符串是另一个非单词字符, *
,因此是第二个空字符串,用于它们之间的空白区域。
然后根据spec将非单词字符拼接回结果数组中:
如果separator是包含捕获的正则表达式 括号,然后每次分隔符匹配,结果 捕获括号的(包括任何未定义的结果)是 拼接到输出数组中。但是,并非所有浏览器都支持此功能 能力。
如果您只想分成其组成字符,为什么不只是打电话给infix.split('')
?
答案 2 :(得分:1)
使用split
方法,当字符串以分隔符开头或以分隔符结尾时,您将有空字符串,或者两个分隔符之间没有任何内容,如注释@mdatsev。您可以使用String.match
方法和正则表达式\W|\w+
来提取所需的模式:
let infix = "(A+B)*C";
console.log(
infix.match(/\W|\w+/g)
)