Заменить строку плюс скобки вокруг нее не работает с RegExp

1

У меня есть строка с несколькими вхождениями такого ключа

var str = '[a] is a string with many [a] but only one [b]';

теперь у меня есть объект с ключами со значениями в str;

var obj = {a:'the a',b:'the b'};

Я пробовал это, заменяя эти ключи своими значениями

let output = str;
for (const key in obj) {
      output = output.replace(new RegExp('[[' + key + ']]', 'g'), obj[key]);
    }

его выход

[the a is a string with many [the a but only one [the b

может ли любое тело сказать, чего я не хватает?

редактировать

Как заменить @[a](a) the a и @[b](b) the b? т.е.

 var str = '@[a](a) is a string with many @[a](a) but only one @[b](b)';
Теги:
string
replace

2 ответа

1
Лучший ответ

Вы должны использовать этот код:

var str = '@[a](a) is a string with many @[a](a) but only one @[b](b)';
var obj = {a:'the a',b:'the b'};

let output = str;
for (const key in obj) {
   output = output.replace(new RegExp('@\\[' + key + '\\]\\(' + key + '\\)', 'g'), obj[key]);
}

console.log(output);
//=> "the a is a string with many the a but only one the b"

[ должен быть экранирован в регулярном выражении Javascript, и при использовании конструктора RegExp дважды RegExp его.

  • 0
    Можете ли вы ответить на отредактированный вопрос, плз?
  • 1
    Конечно, позвольте мне взглянуть. Кстати, вам не нужно снимать отметку с моего ответа, чтобы попросить дальнейших улучшений. Я всегда стараюсь изо всех сил, чтобы ответить на все вопросы.
Показать ещё 2 комментария
1

Пример [[a]]

соответствует либо [] либо a] потому что он анализирует

 [[a]            # Class, '[' or 'a'
 ]               # followed by ']'

Чтобы исправить это, избегайте литералов внешней скобки, чтобы они были литералами.

output = output.replace(new RegExp('\\[[' + key + ']\\]', 'g'), obj[key]);

и вы даже можете избавиться от внутренних кластеров классов, так как есть только 1 ключ каждый проход.

output = output.replace(new RegExp('\\[' + key + '\\]', 'g'), obj[key]);

  • 0
    хорошее объяснение.
  • 0
    @ahmadalibaloch - Остерегайтесь оставлять скобки буквального класса без экранирования. Дизайнеры regex давно оставили трейлеры, которые могли быть буквальными буквами, без необходимости спасаться бегством. Это плохая привычка, которая будет кусать вас, когда регулярное выражение становится более сложным.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню