今天我正在搞乱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)然后测试一个空字符串。
答案 0 :(得分:2)
技术上(A)应该在''
上返回HELLOBYE
因为捕获括号可以捕获'x'和空字符串,因为?
是 in 捕获组。
而在(B)中,捕获括号只能 捕获字符串x
。如果x
不存在,则该组从未被捕获,因为整个组是可选的,而不是正则表达式 小组。
微妙的差异!
所以浏览器或正则表达式引擎总是返回''(A),但它返回的(B)并不是那么明确定义,因此根据实现可能会有所不同 - Chrome区分“匹配空字符串的组”和“组完全不匹配”。虽然IE没有做出这种区分(或者如果它没有,它会将第二种情况的返回类型强制转换为空字符串)。
摘要 - 使用(A)因为你知道如果没有x
那么捕获组肯定匹配''。使用(B)取决于浏览器是否区分“零长度匹配”和“根本不匹配”。