我有一个javascript字符串我试图分裂,但我在返回的数组的开头得到一个空元素,我无法弄清楚原因。
var split_in_el = in_el.split(/(#|\.|\[)/);
其中split_in_el为first
,#last
或[color:red]
。
我得到的返回数组(在Node.js中,但不应该重要)
.first //split_in_el [ '', '.', 'first' ] //returned #last //split_in_el [ '', '#', 'last' ] //returned [color:blue] //split_in_el [ '', '[', 'color:blue]' ] //returned
这是一个显示问题的小提琴手。
答案 0 :(得分:3)
这就是split()
一般的工作原理,假设我们在点.
上拆分以下内容:
Hello.World
^
----- -----
然后返回的数组将是:["Hello", "World"]
。
现在如果上一行是这样的话怎么办:
.World
^
-- -----
然后我们得到一个这样的数组:["", "World"]
,split()
方法返回点.
之前的所有内容以及.
之后的所有内容,点之前没有任何内容{ {1}}这里返回空字符串.
。
在一个更大的例子中:
""
它会返回:.Hello.World.From.
。
现在你情况中令人困惑的部分不应该是你得到空字符串的方式,而是你如何得到你在结果数组中分裂的字符。
例如,当您在["", "Hello", "World", "From", ""]
中围绕点.
进行拆分时,会出现一个点.
,当您围绕磅分开时,会有一个井号.first
在#
等中签名#
。
当您查看documentation of split()
方法时,这一点很明显:
如果separator是包含捕获括号的正则表达式,则每次匹配时,捕获括号的结果(包括任何未定义的结果)都会拼接到输出数组中。
您的案例中的分隔符是正则表达式#last
,它匹配(或拆分)点/(#|\.|\[)/
,井号.
或冒号在捕获组内部#
,因此将它们添加到结果数组中。
:
您可以通过将捕获组转换为非捕获组来解决此问题:
/(#|\.|\[)/
^ ^
---------
These parentheses are used to create the capturing group
最后,我想添加一件事:在/(?:#|\.|\[)/
^^
Notice the syntax
和.first
等情况下,您可能不想使用#last
,而是RegExp.exec()
或{{3使用给定的模式查找特定匹配。
例如,如果您想在split()
字符.
之后检索单词,则可以执行以下操作:
.first