Javascript new Regexp не находит совпадение

259
30 марта 2018, 14:51

Здравствуйте, допустим есть текст:

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. Что не так?

Answer 1

Обратный слэш необходимо экранировать (\\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}`;

READ ALSO
Проверка, есть ли бронирование

Проверка, есть ли бронирование

ЗдравствуйтеПишу приложение на nwjs для администрирования гостиницы

199
Как сделать несколько счётчиков кликов?

Как сделать несколько счётчиков кликов?

Через php клики по кнопке сохраняются в текстовый документ

302
JSDoc: элемент массива

JSDoc: элемент массива

Приведу пример исходной структуры:

212