Определенное регулярное выражение положительный взгляд (вокруг | впереди | сзади) в Javascript

Я ищу, чтобы соответствовать /(?=\W)(gimme)(?=\W)/gi или так. \W должны быть символы нулевой ширины, чтобы окружить мое фактическое соответствие.

Может быть, какой-то фон. Я хочу заменить определенные слова (всегда \w+) с добавлением некоторого буквального отступа, но только если он не окружен \w, (Это звучит как негативный взгляд, но я слышал, что JS не делает этого!?)

(Кстати: вышеприведенное "дай" - это слово, которое я хочу заменить. Если это не было очевидно.)

Это должно быть (?) Взглядом, потому что \W должны быть нулевой ширины, потому что намерение .replace(...) и я не могу заменить / скопировать окружающие символы.

Так что это не сработает:

text.replace(/(?=\W)(gimme)(?=\W)/gi, function(l, match, r) {
  return l + doMagic(match) + r;
})

Символы нулевой ширины должны игнорироваться, поэтому функция может возвращать (и заменять) только doMagic(match),

У меня есть только очень ограниченный опыт работы с внешним миром, и у меня нет опыта в JS. Grazie.

PS. Или, может быть, мне нужен взгляд назад, и они не поддерживаются в JS..? Я не совсем понимаю?

PS. Немного контекста: http://jsfiddle.net/rudiedirkx/kMs2N/show/ (ооо ссылка!)

3 ответа

Решение
  • Вы можете использовать ярлык границы слова \b утверждать, что это все слово, которое вы подходите.

  • Самый простой способ достичь того, что вы хотите сделать, это, вероятно, соответствовать:

/(\s+gimme)(?=\W)/gi

и заменить на [yourReplacement] - т.е. запишите пробелы перед "дай", а затем включите один в замену.

  • Другим способом достижения этой цели будет захват большего количества символов до и после gimme Литерал, а затем с помощью групп с обратной ссылкой:

(\W+?)gimme(\W+?) - ваш матч - обратите внимание, что на этот раз символы до и после находятся в группах захвата 1 и 2

И вы хотели бы использовать \1[yourReplacement]\2 в качестве замены строки - не уверен, как вы используете обратную ссылку в JS, но идея состоит в том, чтобы сказать движку, что с \1 Вы имеете в виду все, что было найдено в первой закрывающей скобке. На некоторых языках они доступны с $1,

То, что у вас есть, не будет работать по следующей причине: (?=\W) означает "следующий символ не является символом слова", а следующая вещь, которую вы пытаетесь сопоставить, является литералом g, поэтому у вас есть противоречие ("следующий символ g, но это не письмо ").

На самом деле вам нужно посмотреть назад, но они не поддерживаются JavaScript.

Посмотрите эту статью о Mimicking Lookbehind в JavaScript для возможного подхода.

Рассматривали ли вы использовать лексер / парсер комбо?

Этот основан на javascript, и идет с элегантной демонстрацией.

Другие вопросы по тегам