2015-08-26 2 views
1

Мне было предложено создать инструмент поиска и замены в JavaScript. (Примечание: Этот вопрос не ограничивается JavaScript, но применимо ко всем языкам, которые поддерживают синтаксис регулярных выражений (?!dont match this).)RegExp: Можно использовать отрицательный просмотр перед началом матча?

В принципе, кто-то может войти в список слов и список замен. Наконец, пользователь может ввести список комбинаций слов, которые должны быть исключены.

Пример:

входной строки:

blue moutain 
blue sea 
blue grass 
foo 
foo foo 

список поиска/замены терминам (здесь рядом друг с другом для ясности)

blue -> red 
sea -> ocean 
foo -> bar 

список исключений:

blue mountain 
blue sea 
foo foo 

Моя система может использовать эти списки для построения регулярных выражений вида:

/\s*(blue)(?!\s*(mountain|sea)\s*))/ 

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

Проблема заключается в том, например, с foo foo. Инструмент видит первый foo и понимает, что за ним следует еще один, который не разрешает regexp /\s*(foo)(?!\s*(foo)\s*))/. Однако затем он переходит ко второму foo, за которым не следует ничего. Поэтому он заменяется, меняя линию foo foo на foo bar.

Итак ... просуммировать вещи:

Почему this regexp ((?!foo)\s*foo) соответствует второму Foo?

+0

Параметр '(?! foo) \ s * foo' regex соответствует второму 'foo' Iin' foo foo', потому что это не lookbehind. Не знаю, какое решение может быть для JS. –

ответ

1

Потому что, если вы печатаете только (?!foo) он будет принимать все позиции не следуют foo:

live here.

Тогда в тех позициях, он будет искать \s*foo:

live here.

+0

Ах! Итак '(?! Foo)' означает * соответствует каждой позиции, за которой сразу не следует foo *? – Qqwy

+0

@Qqwy. Точно, вы поняли! –

Смежные вопросы