Определенное регулярное выражение положительный взгляд (вокруг | впереди | сзади) в 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, и идет с элегантной демонстрацией.