Javascript Regexp问号跨浏览器行为

时间:2012-01-31 05:34:45

标签: javascript regex cross-browser

今天我正在搞乱Javascript regexp并发现了这个:

//Suppose
var one = 'HELLOxBYE';
var two = 'HELLOBYE';

您可以创建一个试图以这两种方式捕获'x'的正则表达式:

/^HELLO(x?)BYE$/ //(A)

//or

/^HELLO(x)?BYE$/ //(B)

我发现当你在var 2上使用(A)时,regexp会返回一个空字符串'';当你使用(B)时,regexp返回null。

你必须小心。

有谁知道这是否是跨浏览器行为?

我在Google Chrome(Webkit)版本15上测试了这个。

更新:哇,只是在Internet Explorer 8上进行了一些测试,并为两种情况返回一个空字符串''。所以我的结论是,最好的选择是使用(A)然后测试一个空字符串。

1 个答案:

答案 0 :(得分:2)

技术上(A)应该在''上返回HELLOBYE因为捕获括号可以捕获'x'和空字符串,因为? in 捕获组。

而在(B)中,捕获括号只能 捕获字符串x。如果x不存在,则该组从未被捕获,因为整个组是可选的,而不是正则表达式 小组。

微妙的差异!

所以浏览器或正则表达式引擎总是返回''(A),但它返回的(B)并不是那么明确定义,因此根据实现可能会有所不同 - Chrome区分“匹配空字符串的组”和“组完全不匹配”。虽然IE没有做出这种区分(或者如果它没有,它会将第二种情况的返回类型强制转换为空字符串)。

摘要 - 使用(A)因为你知道如果没有x那么捕获组肯定匹配''。使用(B)取决于浏览器是否区分“零长度匹配”和“根本不匹配”。