javascript - Javascript 的 string.split 的准确定义是什么?
问题描述
今天有些东西对我有用,但我不确定我是否理解它足以确定它将在随机的未来 Javascript 版本中工作。
我想在空格上使用类似 string.split() 的东西,但这也会返回分隔符字符串。换句话说:
f("abc def ghi")
=> ["abc", " ", "def", " ", "ghi"]
我的第一次尝试是十几行丑陋的正则表达式搜索和循环。
然后我有一个疯狂的想法,我认为工作的几率很低,但值得快速测试:做一个.split
匹配分隔符和非分隔符范围的方法。令我高兴和惊讶的是,这基本上奏效了:
"abc def ghi".split(/([^\s]+|[\s]+)/)
=> ["", "abc", "", " ", "", "def", "", " ", "", "ghi", ""]
再做一点小调整,我就得到了我需要的东西:
"abc def ghi".split(/([^\s]+|[\s]+)/).filter(s=>s.length)
=> ["abc", " ", "def", " ", "ghi"]
当然,问题是我可以想象 Javascript 实现在这个有点病态的正则表达式上会有不同的行为。
我可以依靠这种行为始终有效吗?为什么?规范记录在哪里?
对于“额外的功劳”,您能否给出一个直观的论据,为什么这种行为是最合理的?
解决方案
如果参数 tosplit
是带有捕获组的正则表达式,则匹配的组将作为返回数组中的单个项目返回。此外,如果正则表达式包含多个捕获组,它们都将作为单独的元素包含在返回数组中。
let input = 'a 8_b 0_c';
console.log(input.split(/ \d_/));
console.log(input.split(/ (\d)_/)); // includes numbers
console.log(input.split(/( )(\d)_/)); // includes spaces and numbers
console.log(input.split(/( )(\d)(_)/)); // includes spaces, numbers, and underscores
因此,对于您的用例,您可以将解决方案简化为
let x = "abc def ghi".split(/(\s+)/);
console.log(x);
如果separator是一个包含捕获括号的正则表达式,则每次匹配separator时,捕获括号的结果(包括任何未定义的结果)都会拼接到输出数组中。
推荐阅读
- sql - 如果行已经存在,则不要插入 SPOON
- python-3.x - 如何在没有多次登录的情况下在 python selenium 中导航网站
- android - 如何使用 MainActivity 中的多个操作调用 IntentService?
- python - Python 没有捕捉到 control-C 陷阱
- vue.js - 如何修复 vscode 中的 eslint 缩进错误?
- angular-material - 尝试在 Stackblitz 中使用 @angular/material 时出错
- go - RabbitMQ 本地主机连接失败
- javascript - 如何在javascript中使用模板标签?姜戈
- html - 如何创建卡片
- javascript - 如何使用本地护照登录用户并显示错误消息?