浏览器对前瞻性正则表达式的不同解释

时间:2010-08-13 08:48:38

标签: javascript regex split lookahead

我在javascript中使用/\s+(AND|OR)(?=\s+")\s+/

上运行拆分
"email" IS NOT NULL AND "email" LIKE '%gmail.com' OR "email" = 'test@test.com'

现在,我对正则表达式的理解会让我期望获得以下数组:

[0]: "email" IS NOT NULL
[1]: "email" LIKE '%gmail.com'
[2]: "email" = 'test@test.com'

注意:为了清晰起见,我删除了分隔符。

然而,我获得了

[0]: "email" IS NOT NULL
[1]:  AND
[2]: "email" LIKE '%gmail.com'
[3]:  OR
[4]: "email" = 'test@test.com'

在OS X 10.6.4上的Firefox 3.6.8,Chrome 5.0.375.126和Safari 5.0.1上运行时。

但是,当我尝试使用默认设置的最新IE8 8.0.6时,我首先获得了我期望的内容。带有preg_split的PHP 5.2.10也会以这种方式拆分它。

我的猜测是,一旦'好'的浏览器弄错了,但我想要更多意见。

编辑:我在这里用电子邮件提供的示例是一个简单的例子。基本上我不知道每个成员都可以。 "xyz" = '1' AND "zyx" = 'test AND toast'是另一个可能的输入字符串。

我对结构的了解是整个字符串将具有以下模式:

"<attribute>" <operator> '<value>'( (AND|OR) "<attribute>" <operator> '<value>')*

注意:空格实际上代表\s+

3 个答案:

答案 0 :(得分:1)

尝试拆分/\b(?:AND|OR)\b/,然后修剪生成的部分。

请注意,布尔运算符具有优先级规则,您不能只在ANDOR上拆分而不会失去意义。此外,布尔表达式可以(理论上)包含在嵌套括号中,这基本上排除了正则表达式作为解析它们的技术。

答案 1 :(得分:1)

这将返回您想要的结果:

var string = "\"email\" IS NOT NULL AND \"email\" LIKE '%gmail.com' OR \"email\" = 'test@test.com'"
string.split(/\s+(?:AND|OR)\s+/)

答案 2 :(得分:0)

看起来Firefox和Chrome完全正确,因为根据ECMAScriptv5第15.5.4.14节的规范

  

如果separator是正则表达式   包含捕获括号,   然后每次分隔符匹配   结果(包括任何未定义的   捕获括号的结果)   被拼接到输出数组中。

     

例如,

"A<B>bold</B>and<CODE>coded</CODE>".split(/<(\/)?([^<>]+)>/)
     

计算数组

     

[“A”,未定义,“B”,“粗体”,“/”,   “B”,“和”,未定义,       “CODE”,“coded”,“/”,“CODE”,“”]

指向Mozilla的Chris Leary的规范。