使用JS拆分函数的RegEx的不同结果 - 结果中的空字符串

时间:2014-05-04 10:38:21

标签: javascript regex string split

我正在尝试使用JavaScript中的正则表达式和拆分函数拆分字符串。 例如,我有一个字符串: olej sojowy, sorbitol, czerwień koszenilową 我的RegEx是:

/, (?!(któ))/g

我在这里测试时: http://regexr.com/38ps8我得到了2个匹配,正如预期的那样,所以在结果中我应该在分割后获得3个元素。

但是当我尝试在split函数中使用这个表达式时:

var parts="olej sojowy, sorbitol, czerwień koszenilową".split(/, (?!(któ))/g);
console.log("Num of elements:" + parts.length); 
console.log(parts.join("!\n!"));

结果不同,它返回一个数组中的5个元素,另外还有两个空字符串:

Num of elements:5 
olej sojowy!
!!
!sorbitol!
!!
!czerwień koszenilową 

为什么它没有按预期工作?这是拆分功能的问题吗?它是否以与我预期不同的方式使用正则表达式?

编辑: 我刚刚注意到,如果我将我的正则表达式更改为/,/ g然后我得到我想要的结果(结果中有3个元素),但是如果有któ之后还有其他字符串我不想拆分昏迷和空间。那么为什么这个运算符会改变split的行为?

2 个答案:

答案 0 :(得分:1)

它完全按照预期工作。您已使用,作为分隔符,因此它为您提供了五个元素:

[1] olej sojowy
[2]   
[3] sorbitol
[4]   
[5] czerwień koszenilową

空元素是分割所在位置的指示符。

答案 1 :(得分:0)

来自Mozilla's JS ref

  

如果separator是包含捕获括号的正则表达式,则每次匹配时,捕获括号的结果(包括任何未定义的结果)都会拼接到输出数组中。但是,并非所有浏览器都支持此功能。

如果split中的正则表达式包含捕获组,则每个组的内容也会插入到结果中。由于你有一个捕获组(któ),这就是你得到的。它是空的,因为(?!(któ))为空。如果您在字符串中的任何位置添加文字, któ,您会看到它出现:

var parts="olej sojowy, któ sorbitol, czerwień koszenilową".split(/, (?!(któ))/g);

显示3个元素。第二个是非常令人惊讶的,只是", "。然后, któ跟随的那个(不知道我怎么能"证明"那")。

如果省略前瞻中的括号,它会按预期工作:

var parts="olej sojowy, któ sorbitol, czerwień koszenilową".split(/, (?!któ)/g);

没有捕获组,因此在删除匹配的正则表达式后,您只获得剩余的文本。