2012-06-08 4 views
3

Я ищу, чтобы соответствовать /(?=\W)(gimme)(?=\W)/gi или похожим. Предполагается, что \W являются символами нулевой ширины, которые окружают мое фактическое совпадение.Конкретный regex положительный внешний вид (вокруг | впереди | сзади) в Javascript

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

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

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

Так что это не будет работать:

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

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

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

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

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

+0

lookbehind не поддерживается в JS - вы можете использовать короткую ссылку на слово, хотя '\ b' –

+0

Джоанна, я люблю тебя, разве я вам это говорил? Строчная буква 'b' теперь является моим новым героем! Милая! Отлично! И на самом деле гораздо проще, чем два раза ... Если вы хотите rep, создайте ответ, и все это ваше! – Rudie

+0

lol: -D см. Несколько других вариантов в моем ответе ниже –

ответ

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

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

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

и заменить [yourReplacement] - то есть захватить пробельные до того «Дай мне», а затем включать в себя один в замена.

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

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

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

+0

Я не могу захватить (и заменить) окружающие персонажи. 'innerHTML' испортит его, если я заменю больше, чем точное совпадение. – Rudie

+0

@Rudie - Не заменяя окружающих персонажей, вы заменяете только «gimme». Так что ты имеешь в виду, что это испортит это? – sln

+0

Если я совпадаю с '\ sgimme', я должен заменить' \ s' на '\ s' (или' $ 0' или '\ 0'). («\ S» может даже не быть «\ s» btw. Все, что я знаю, это не '\ w'.) Мой« Так это не работает »- пример должен быть ясным ... – Rudie

2

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

Вы действительно нуждаетесь в поиске, но JavaScript не поддерживается.

Ознакомьтесь с этой статьей на Mimicking Lookbehind in JavaScript для возможного подхода.

+0

Итак, мне нужно 1 lookbehind и 1 lookahead, не так ли? LOL Awesome! – Rudie

+0

Это правильно, вам нужно посмотреть назад и посмотреть, я бы, вероятно, использовал '(?

1

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

This one размещено на основе javascript и поставляется с spiffy demonstration.

+0

Это крошечный бит overkill IMO, но +1 для «spiffy» и ссылки. – Rudie

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