为什么这个正则表达式在数组的开头返回一个空项?

时间:2013-10-19 06:02:57

标签: regex arrays

我有一个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

这是一个显示问题的小提琴手。

1 个答案:

答案 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