V8 的正则 split 的实现?出现诡异的结果
理论上用正则对字符串进行 split 时,应是在匹配的每一个位置进行切割并扔掉匹配到的部分,然后以数组的形式返回
例如
',a,b,c,'.split(/,/) // return ['', 'a', 'b', 'c', '']
'abc'.split(/()/) // Expected to return ['', 'a', 'b', 'c', ''] as well
伪代码:
while (hasNextMatch()) {
splitAt(matched().index)
increaseLastIndex(matched().length || 1)
}
return calcResult()
完整实现:
function split(s, regex) {
function implement() {
while (hasNextMatch()) {
splitAt(matched().index)
increaseLastIndex(matched().length)
}
return calcResult()
}
function hasNextMatch() {
return (lastMatch = regex.exec(s)) && (lastMatch = { index: lastMatch.index, length: lastMatch[0].length })
}
function matched() {
return lastMatch
}
function increaseLastIndex(n) {
regex.lastIndex += n || 1
lastSplit += n
}
function splitAt(index) {
result.push(s.substring(lastSplit, index))
lastSplit = index
}
function calcResult() {
result.push(s.substring(lastSplit, s.length))
return result
}
var result = []
var lastSplit = 0
var lastMatch
return implement()
}
console.log(split('abc', /()/g)) // [ '', 'a', 'b', 'c', '' ]
然而
'abc'.split(/()/g)
返回
['a', '', 'b', '', 'c']
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
'abc'.split(/(?:)/g)