这就是split()
一般的工作方式,假设我们在 dot 上拆分以下内容.
:
Hello.World
^
----- -----
那么返回的数组将是:["Hello", "World"]
。
现在如果上一行是这样的:
.World
^
-- -----
然后我们得到一个这样的数组:["", "World"]
,该split()
方法返回点之前的.
所有内容和之后的所有内容.
,这里点之前不存在任何内容,.
因此它返回空字符串""
。
在一个更大的例子中:
.Hello.World.From.
它会返回:["", "Hello", "World", "From", ""]
.
现在,您的情况中令人困惑的部分不应该是如何获得空字符串,而是如何获得要在结果数组中拆分的字符。
例如,.
当你在点.
in周围分割时有一个点,当你在井号周围分割时.first
有一个井号,等等。#
#
#last
当您查看方法的文档split()
时,这会变得很明显:
如果 separator 是一个包含捕获括号的正则表达式,那么每次 separator 匹配时,捕获括号的结果(包括任何未定义的结果)都会拼接到输出数组中。
在您的情况下,分隔符是一个正则表达式/(#|\.|\[)/
,匹配(或拆分)捕获组内的点.
、磅符号#
或冒号:
,因此它们被添加到结果数组中。
/(#|\.|\[)/
^ ^
---------
These parentheses are used to create the capturing group
您可以通过将捕获组转换为非捕获组来解决此问题,如下所示:
/(?:#|\.|\[)/
^^
Notice the syntax
最后我想补充一件事:在这样的情况下.first
,#last
您可能不想使用split()
,而是RegExp.exec()
使用String.match()
给定模式查找特定匹配项。
例如,如果你想在一个.
字符之后检索单词,.first
那么你可以这样做:
var matches = ".first".match(/\.\w+/);