2012-06-19 3 views
2

Мне нужно сопоставить браузеры Safari, но не браузер Chrome, использующий одно Regex. Обычно у меня нет проблем с регулярным выражением, но негативные ожидания опережают меня здесь.Regex Negative Lookahead для Chrome & Safari

/(?!chrome)(safari)/i.test("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5"); 

не могу понять, почему это возвращается true.

+0

Вы соответствуете подстроке 'safari', которая не равна' chrome'. (Не очень важно, если я это правильно понимаю.) – pimvdb

+0

Хм, я, вероятно, неправильно истолковал использование. Я пытаюсь выполнить сафари по совпадению строк, но только если строка не соответствует хром. – dtbarne

+0

[Отрицательный взгляд:] (http://www.regular-expressions.info/lookaround.html) 'q (?! U)' соответствует 'q', который не является *, а затем' u'. Это не поможет. Вам действительно нужен отрицательный lookbehind для этого задания (строка содержит 'Safari', которой не предшествует' Chrome'), но JS не поддерживает отрицательный lookbehind. –

ответ

4

Это будет делать это

^(?!.*chrome).*(safari) 

BTW JavaScript не поддерживает просмотр назад, но я не вижу никаких проблем с опережающим просмотром.

То, что вы говорите с

(?!chrome)(safari) 

Это прямо перед «сафари» (нулевой ширины так, начиная с курсора до с) не может быть строка «хром», который не имеет смысла.

+0

Код, который я дал в сообщении, является образцом. – dtbarne

+0

@dtbarne Я вижу. Я обновил ответ – buckley

+0

Это работает, спасибо! Имеет смысл. Другой пример, который я видел в своем понимании. – dtbarne