我在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+
答案 0 :(得分:1)
尝试拆分/\b(?:AND|OR)\b/
,然后修剪生成的部分。
请注意,布尔运算符具有优先级规则,您不能只在AND
和OR
上拆分而不会失去意义。此外,布尔表达式可以(理论上)包含在嵌套括号中,这基本上排除了正则表达式作为解析它们的技术。
答案 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的规范。