Получение SyntaxError при использовании переменной с RegExp

Когда следующий код в моем приложении node.js выполняется, я получаю сообщение об ошибке:

SyntaxError: Недопустимое регулярное выражение: /ha/: Нечего повторять в новом RegExp () в Object.store.findSimilarSongs

Фрагмент app.js:

app.get('/search', function (req, res, next) {

    store.findSimilarSongs(req.query.search, function (err, songs) {
        if (err) {
            res.writeHead(500, "An Error occurred");
            next(err);
        }
        else {
            res.writeHead(200, {
                'Content-Type': 'application/json'
            });
            res.write(JSON.stringify(songs));
            searchQuery=[];
        }
        res.end();
    });
});

функция "findSimilarSongs" в моем store.js:

findSimilarSongs: function (query, callback) {
        db.music.find({$or:[{'title': new RegExp("*"+query+"*", "i")},{'interpret': new RegExp("*"+query+"*", "i")}]}, callback);
    }

Я новичок в регулярных выражениях, особенно в сочетании с mongodb/mongoskin. Пока ошибка не появится, все работает нормально. ha, упомянутый в сообщении об ошибке, — это именно то, что я ввел в строку поиска.

К сожалению, у меня нет возможности выполнить эту задачу какими-либо другими средствами, кроме javascript/jquery, node.js(modules:express, mongoskin) и mongodb.


person KimBum    schedule 19.04.2014    source источник
comment
* имеет особое значение в регулярном выражении. Имея его в начале, вы поставили его в недопустимое положение. Если вы хотите сопоставить буквальный символ *, вам нужно экранировать его обратной косой чертой. И поскольку строковые литералы JS используют обратную косую черту в качестве специального символа, вам также нужно экранировать обратную косую черту. Итак, "\\*" + query + "\\*"   -  person cookie monster    schedule 19.04.2014


Ответы (1)


В нем говорится "нечего повторять", поскольку созданное вами регулярное выражение было /*hal*/. Это определенно недопустимо — вы не можете начать с оператора повторения. Я думаю, вы либо хотели нечеткое совпадение:

new RegExp(".*"+query+".*, 'i')

или буквальная звезда:

new RegExp("\\*"+query+"\\*", 'i')
person Bergi    schedule 19.04.2014
comment
Протестировал обе ваши версии, но получил одну и ту же ошибку: SyntaxError: Неверное регулярное выражение: /*ma*/: Нечего повторять в новом RegExp (‹anonymous›) - person KimBum; 20.04.2014