Строка JavaScript, многократная замена - PullRequest
1 голос
/ 20 августа 2011

У меня есть небольшое веб-приложение, в котором мне нужно выполнить замену текста в строке. Однако обычный string.replace не будет работать. Я изменяю части текста, а затем мне нужно вернуть их в исходную строку. Например, если у меня есть:

var text = 'TEXT 000.99 001.00 TEXT'

и мне нужно добавить 0,01 к каждому из этих чисел, у меня есть массив результатов:

var new_vals = [001.00, 001.01]

Затем, когда я пытаюсь заменить 000.99 на 001.00, это сработает и выдаст мне следующую строку:

text = 'TEXT 001.00 001.00 TEXT'

Теперь я столкнулся с проблемой. Следующая замена должна быть 001.00 <- 001.01, но это приведет к: </p>

text = 'TEXT 001.01 001.00 TEXT'

У меня вопрос: знаете ли вы какую-либо библиотеку JS, которая предоставляет функцию замены, которая может выполнять несколько операций поиска / замены одновременно и для копии строки?

Ответы [ 3 ]

3 голосов
/ 20 августа 2011

Используйте str.replace с функцией:

var text = 'TEXT 000.99 001.00 TEXT';
var new_vals = ["001.00", "001.01"];
var index = 0;
//Returns a new result string
var result = text.replace(/\b([\d.]+)\b/g, function(substr, num, offset, str){
  //See if the number is actually a number
  var num = parseFloat(num);
  //If not, return original
  if(isNaN(num))
    return substr;
  //Return the number from new_vals and increment the index
  else
    return new_vals[index++];
});
//result == "TEXT 001.00 001.01 TEXT"

Или вы можете сделать дополнение в функции:

var text = 'TEXT 000.99 001.00 TEXT';
//Returns a new result string
var result = text.replace(/\b([\d.]+)\b/g, function(substr, num, offset, str){
  //See if the number is actually a number
  var num = parseFloat(num);
  //If not, return original
  if(isNaN(num))
    return substr;
  //Return num+0.01 with 2 decimal places
  else
    return (num+0.01).toFixed(2);
});
//result == "TEXT 1.00 1.01 TEXT"
0 голосов
/ 20 августа 2011

Вы можете попробовать split(' ') значения в массиве.Затем изменение конкретных элементов с помощью цикла.Затем следует join(' ') для объединения текста обратно в строку.

0 голосов
/ 20 августа 2011

Попробуйте использовать глобальное регулярное выражение замены вместо простой строки.Простая строка заменит только первый соответствующий экземпляр.

'TEXT 001.00 001.00 TEXT'.replace(/001.00/g, '001.01');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...