这就是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+/);