2015-03-18 4 views
-2

У меня есть строка, как: The zoo has a panda named {{123}} that is colored {{234}}Javascript Извлечение лексем из строки в массив

У меня есть массив, который представляет каждый из маркеров, как:

[ { label: 'Ralph', id: '123' }, { label: 'White and Black', id: '234' } ]

Я хочу, чтобы пересечь строку и замените {{token}} на фактическую метку, но мне также нужно отслеживать положение символа, которое я заменяю. Ральф был бы персонажем 26-го места. Более сложным сценарием было бы следующее: после того, как я заменил {{123}}Ralph, текстовая позиция цвета будет отличаться, так как Ralph - 5 символов, а токен - 7 символов.

Любые мысли о самом быстром подходе к решению этого вопроса?

+1

Попробуйте сначала решить вашу проблему. Оттуда попробуйте оптимизировать его. – HamZa

+0

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

+1

@amcdnl почему регулярное выражение? 'indexOf()' отлично – Hacketo

ответ

6

Это может быть не так сложно, как вы бы себе:

var str = "The zoo has a panda named {{123}} that is colored {{234}}"; 
 
var array = [ { label: 'Ralph', id: '123' }, { label: 'White and Black', id: '234' } ]; 
 

 
for(var i = 0; i < array.length; i++){ 
 
    str = str.replace("{{" + array[i].id + "}}", array[i].label); 
 
} 
 
alert(str);

Просто цикл по массиву и заменить каждую клавишу в строке с нужной меткой. Если ключ не найден в строке, replace просто ничего не делает.

+2

OP также хочет индексы замененных элементов, хотя непонятно, почему, или в какой форме. –

+1

@PaulRoub: Я предполагаю, что он хочет индексы для подстрочных методов, которые он не должен использовать в первую очередь. – Cerbrus

+0

Комментарии не предназначены для расширенного обсуждения; этот разговор был [перемещен в чат] (http://chat.stackoverflow.com/rooms/73256/discussion-on-answer-by-cerbrus-javascript-extract-tokens-from-string-into-array). – Taryn

0

Если вы хотите, чтобы позиция маркера указана, вы можете использовать String.prototype.split для разбивки на каждый токен, тогда вам не нужно заботиться об индексах.

var str = "The zoo has a panda named {{123}} that is colored {{234}}"; 
str.split(/\{\{(.+?)\}\}/g); 

//["The zoo has a panda named ", "123", " that is colored ", "234", ""] 

fiddle пример использования

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