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