Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Результат совпадения в regexp не работает в качестве ключа хеша. Что не так? (https://javascript.ru/forum/misc/85108-rezultat-sovpadeniya-v-regexp-ne-rabotaet-v-kachestve-klyucha-khesha-chto-ne-tak.html)

javascript_pupil 08.04.2023 22:22

Результат совпадения в regexp не работает в качестве ключа хеша. Что не так?
 
Краткий пример:

function search_replace(entry) {

const slovar = {};
slovar['золото'] = 'Au';

var obj = document.forms[0].elements[entry];
var str = obj.value;

re = /золото/g;
str = str.replace(re, slovar[$1]); // НЕ работает

re = /золото/g;
str = str.replace(re, $1); // работает

obj.value = str;

}


Т.е. регулярное выражение нормально ловит слово "золото" и помещает его в $1, но при этом не понимает конструкцию slovar[$1], хотя хеш вроде бы как рабочий и slovar['золото'] выдает Au.

Где ошибка?

voraa 08.04.2023 22:55

Цитата:

Сообщение от javascript_pupil
str = str.replace(re, $1); // работает

Я думаю, что это тоже не работает. Должно быть
str = str.replace(re, '$1');

Цитата:

Сообщение от javascript_pupil
str = str.replace(re, slovar[$1]);

Ну это не работает, т.к. вторым аргументом может быть либо строка, в которой могут быть шаблоны замены, либо функция. А вы передаете свойство объекта, имя которого задано неопределенной переменной $1

$1 для замены можно использовать только внутри строки.
Но и $1 ничего не даст. это ссылка на первую группу в регулярном выражении. А у вас нет там групп.

voraa 08.04.2023 23:11

const slovar = {};
slovar['золото'] = 'Au';

let str = 'нашел золото';

const re = /золото/g;
str = str.replace(re, (m) => slovar[m]);
alert(str) // 'нашел Au'

javascript_pupil 15.04.2023 11:29

Спасибо за ответ! Из него я понял, что для подобных задач лучше использовать другой язык программирования. Сделал это на Perl, но столкнулся с другой проблемой. Данные не хотят меняться в textarea в современных браузерах. Работает только в IE11.


Часовой пояс GMT +3, время: 13:26.