今天有什么对我有用,但是我不确定我是否足够了解它,以确保它可以在将来的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实现在这种有些病理性的正则表达式上的表现会有所不同。
我可以依靠这种行为始终有效吗?为什么?规范记录在哪里?
对于“额外信用”,您能否给出一个直观的论证,为什么这种行为最合理?
答案 0 :(得分:2)
如果split
的参数是带有捕获组的正则表达式,则匹配的组将作为返回数组中的单个项返回。而且,如果正则表达式包含多个捕获组,则它们都将作为单独的元素包含在return数组中。
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);
如果分隔符是一个包含捕获括号的正则表达式,则每次匹配分隔符时,捕获括号的结果(包括任何未定义的结果)都会被拼接到输出数组中。