Браузеры по-разному интерпретируют regex с lookahead - PullRequest
2 голосов
/ 13 августа 2010

Я выполняю разбиение в 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'

при работе на Firefox 3.6.8, Chrome 5.0.375.126 и Safari 5.0.1 на OS X10.6.4.

Однако, когда я попробовал обновленную версию IE8 8.0.6 с настройками по умолчанию, я получил то, что ожидал вначале.PHP 5.2.10 с preg_split также разделяет его таким образом.

Я предполагаю, что на этот раз «хорошие» браузеры ошиблись, но мне хотелось бы больше мнений.

Редактировать: Пример, который я привел здесь с электронными письмами, является наивным примером.По сути, я не знаю, кем может быть каждый участник."xyz" = '1' AND "zyx" = 'test AND toast' - еще одна возможная входная строка.

Что мне известно о структуре, так это то, что вся строка будет иметь следующий шаблон:

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

Примечание: пробелы фактически представляют \s+

Ответы [ 3 ]

1 голос
/ 13 августа 2010

Это вернет желаемый результат:

var string = "\"email\" IS NOT NULL AND \"email\" LIKE '%gmail.com' OR \"email\" = 'test@test.com'"
string.split(/\s+(?:AND|OR)\s+/)
1 голос
/ 13 августа 2010

Попробуйте разделить на /\b(?:AND|OR)\b/ и обрезать получившиеся части.

Помните, что логические операторы имеют правила приоритета, и вы не можете просто разделить на AND и OR без потери значения.Кроме того, логические выражения могут (теоретически) быть заключены во вложенные скобки, что в основном исключает использование регулярных выражений в качестве технологии их анализа.

0 голосов
/ 16 августа 2010

Похоже, что Firefox и Chrome сделали все правильно, так как в соответствии со спецификациями раздела 15.5.4.14

ECMAScriptv5 Если разделитель является регулярным выражением, содержащим круглые скобки, то каждый разСоответствующие результаты (включая любые неопределенные результаты) захватывающих скобок вставляются в выходной массив.

Например,

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

оценивается в массив

["A ", undefined," B "," bold "," / "," B "," and ", undefined," CODE "," coded "," / "," CODE "," "]

Указатель на спецификации Криса Лири из Mozilla.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...