2013-08-10 3 views
2

У меня есть относительно простая проблема с регулярным выражением - мне нужно сопоставить определенные слова в строке, если они целые слова или префикс. С словоразделами, это будет выглядеть примерно так:Javascript Regex: как имитировать поведение «match without capture» позитивного lookbehind?

\b(word1|word2|prefix1|prefix2) 

Однако, я не могу использовать граничное условие слова, потому что некоторые слова могут начинаться с нечетными символами, например, .999

Моим решением было искать пропущенное или начальное значение для этих нечетных случаев.

(\b|^|\s)(word1|word2|prefix1|prefix2) 

Теперь такие слова, как .999 равно будут соответствовать правильно, но он также фиксирует пропуска предшествующих совпавшие слов/префиксы. Для моих целей я не могу захватить пробелы.

Положительные lookbehind, кажется, решают это, но javascript их не поддерживает. Есть ли другой способ, которым я могу получить такое же поведение, чтобы решить эту проблему?

+0

Вы здесь же? Если нет, не могли бы вы просто удалить какие-либо ведущие пробелы из итогового матча? –

ответ

5

Вы можете использовать не захватывая группу с помощью (?:):

/(?:\b|^|\s)(word1|word2|prefix1|prefix2)/ 

UPDATE:

Основываясь на том, что вы хотите, чтобы заменить его (и @ хороший момент Алан Мур в о \b), вы, вероятно, хочу пойти с этим:

var regex = /(^|\s)(word1|word2|prefix1|prefix2)/g; 
myString.replace(regex,"$1<span>$2</span>"); 

Обратите внимание, что я изменил первую группу обратно в захватывая один, так как это будет часть матча, но вы хотите сохранить его в заменяющей строке (правильно?). Также добавлен модификатор g, так что это происходит для всех вхождений в строку (предполагая, что это то, что вы хотели).

+0

О, я должен был упомянуть, что я пробовал это. По какой-то причине это не работает. Когда я использую это регулярное выражение для замены, он также заменяет пробелы. – DiglettPotato

+0

@ DiglettPotato: Что вы пытаетесь заменить? –

+0

строка.replace (regexp, " $ 1"); - пробел съедается – DiglettPotato

1

Давайте сначала получим терминологию. Регулярно потребляет все, что соответствует. Когда вы делаете replace(), все, что было потреблено, перезаписывается. Вы можете также захват части согласованный текст по отдельности и подключить их обратно с помощью $1, $2 и т.д.

Когда вы использовали слово границы вы не должны беспокоиться об этом, потому что \b не потреблять что угодно. Но теперь вы потребляете лидирующий символ пробела, если он есть, поэтому вам нужно снова подключить его. Я не знаю, что вы заменяете, и я просто заменил их ничем для этой демонстрации ,

result = subject.replace(/(^|\s)(word1|word2|prefix1|prefix2)/g, "$1"); 

Отметьте, что \b больше не нужен. На самом деле, вы должны удалить его, либо он будет соответствовать вещам вроде .999 в xyz.999, потому что \b соответствует z и .. Я почти уверен, что ты этого не хочешь.

+0

спасибо за это, не понял разницы в замене – DiglettPotato