【问题标题】:Browsers different interpretations of a regex with lookahead具有前瞻功能的浏览器对正则表达式的不同解释
【发布时间】:2010-08-13 08:48:37
【问题描述】:

我正在使用/\s+(AND|OR)(?=\s+")\s+/ 在javascript 中进行拆分

"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'

在 Firefox 3.6.8、Chrome 5.0.375.126 和 OS X 10.6.4 上的 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+

【问题讨论】:

  • 只匹配 AND 和 OR 正是我需要它做的,因为我正在分裂这个。您提供的链接完全显示了我期望的结果。顺便说一句,不错的网站,我不知道。
  • 对不起,我删除了我的评论。我已经监督你想要分裂

标签: javascript regex split lookahead


【解决方案1】:

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

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

【讨论】:

  • 这是行不通的,因为您可以很好地设想一个测试字符串包含“AND”的情况。我在这里给出的电子邮件示例是一个简单的示例。基本上我不知道每个成员可以是什么。 "xyz" = '1' AND "zyx" = 'test AND toast' 是另一个可能的输入。
  • @Guillaume:没错。这就是为什么您绝不能使用正则表达式解析结构化语言的原因。这适用于 HTML,就像它适用于嵌套字符串或布尔表达式一样。它。做。不是。工作。使用(或编写)一个实际的解析器来解决这个问题。查看PEG.js 以根据您定义的语法生成基于 JS 的解析器。
  • 有趣的图书馆。当我有更多时间时,我会尝试一下。然而,对于我正在做的事情来说,这可能有点矫枉过正。我完全了解在不带括号的情况下混合使用 AND 和 OR 运算符的含义,但该工具将由少数称职的员工操作。这就是为什么我们选择在简单条件下采用这种方式做事的原因。出于其他目的,我们提供了一个文本编辑器。
【解决方案2】:

这将返回你想要的结果:

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

【讨论】:

    【解决方案3】:

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

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

    例如,

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

    对数组求值

    [“A”,未定义,“B”,“粗体”,“/”, “B”,“和”,未定义, “代码”、“编码”、“/”、“代码”、“”]

    指向 Mozilla 的 Chris Leary 的规范。

    【讨论】:

      猜你喜欢
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 2014-04-17
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      相关资源
      最近更新 更多