Замена строки в подстроке JavaScript

291
14 февраля 2017, 21:16

Есть строка:

let formula = 'A+B*(ABS(B-A))'

И есть объект:

let replace_func = {
    A: 'C+5',
    B: 'D-2'
}

Необходимо сделать замену переменных в строке 'formula' на элементы 'replace_func' по ключам, так чтобы получилось:

let result = '(C+5)+(D-2)*(ABS((D-2)-(C+5)))'

Чтобы избежать замены в названии функции ABS(), было решено использовать регулярку:

let replace_regx = new RegExp('[\/\*\-\+\(]?' + cur_key + '[\/\*\-\+\)]?')
formula = formula.replace(replace_regx, replace_func[cur_key])

Но по регулярке заменяется не только название переменой, но и знаки перед и после нее (напр. вместо 'A' берется '-A)')

Как можно решить данную проблему? В регулярках не силен, поэтому прошу помощи)

Answer 1

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

В этом случае регулярное выражение примет вид:

/\b\w\b/g

При использовании этого выражения в методе replace, в функцию-обработчик будет передаваться отдельно стоящая буква, которая и будет возможной переменной для замены.

Возвращать из функции обработчика можно либо значение соответствующее замене, либо, если переменная отсутствует в списке замен, само совпавшее значение.

И общий вызов станет более общим.

let formula = 'A+B*(ABS(B-A))' 
let replace_func = { 
  A: 'C+5', 
  B: 'D-2' 
} 
console.log(formula); 
let result = formula.replace(/\b\w\b/g, $0 => `(${replace_func[$0] || $0})`); 
console.log(result);

READ ALSO
Как ускорить обработку данных JSON в JS?

Как ускорить обработку данных JSON в JS?

Необходимо уведомить Вас сразу: для меня эта тема новая, я знаком лишь с php

285
Как передать значение типа radio

Как передать значение типа radio

ЗдравствуйтеЕсть код:

382
Создание 3д ифрейма

Создание 3д ифрейма

Вопрос такой стоит задача сделать 3д интерфейс вот с такими окнами: использовал все что мог и знал :

256
Отключение событий мыши на сайте с сохранением событий сенсорного ввода через расширения браузера

Отключение событий мыши на сайте с сохранением событий сенсорного ввода через расширения браузера

Добрый деньЕсть потребность игнорировать или перехватывать события мыши, такие как mousemove, mouseover, mouseout, то есть при наведении на ссылки не менять...

300