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

Different results of RegEx using JS split function - empty strings in result

本文关键字:结果 RegEx 字符串 拆分 JS 函数 使用      更新时间:2023-09-26

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

/, (?!(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的行为呢?

一切正常。您使用,作为分隔符,因此它提供了五个元素:

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

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

来自Mozilla的JS ref:

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

如果split中的regex包含捕获组,则将每个组的内容也插入到结果中。因为你有一个捕获组(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);

没有捕获组,因此在删除匹配的regex后,您只获得剩余的文本。