Здравствуйте, допустим есть текст:
itemsview_226=%2B; itemsview_227=%2B; usersview_2=%2B; jv_close_time_27t4wRIOv4=1522243008801; online=186; lastvisit_Admin=1522253437; _gat_gtag_UA_101360848_2=1; jv_pages_count_27t4wRIOv4=470
Делаем: a.match(/online=(\w+)/g) и находим ["online=186"]
Теперь делаем так:
reg = new RegExp('online=(\w+)', 'g');
console.log(str.match(reg));
И находим null. Что не так?
Обратный слэш необходимо экранировать (\\w+):
const str = 'jv_close_time_27t4wRIOv4=1522243008801; online=186; lastvisit_Admin=1522253437;';
let re = new RegExp('online=(\\w+)', 'g');
document.body.textContent = str.match(re);
Экранирование необходимо по той причине, что в конструктор RegExp передается параметр строкового типа - а в строках, символ \ является служебным: он используется для вывода спецсимволов (например, \n), и, собственно, для экранирования тех символов и последовательностей, которые могут быть интерпретированы как специальные.
В вашем случае, последовательность \w была обработана как экранирование символа w: выражение приобрело вид online=(w+), что и приводило к неожиданному результату.
В случае литеральной записи регулярного выражения (то есть, при записи вида /online=(\w+)/g ) - экранировать обратный слэш не нужно, так как при этом сразу создается экземпляр объектного типа RegExp:
let re = /\w/i;
document.body.textContent = `Тип экземпляра рег.выражения при литеральной записи - ${typeof re}, а его класс - ${re.constructor.name}`;
Сборка персонального компьютера от Artline: умный выбор для современных пользователей