javascript - 为什么我的 Regex 使用 "++"而不是任何其他特殊字符组合创建内部服务器错误?

标签 javascript regex

我正在尝试创建一个将从 Mongo 数据库返回结果的基本搜索。查询应匹配完整值或值内的值。例如,搜索 C应该返回 C, C#, C++ .此外,Java应该同时返回 Java, Javascript .我目前设置了一个简单的实现可以完成此操作,但是如果我搜索查询 C++ ,返回时出现内部服务器错误。搜索 C+将返回 C++ 的成功搜索正在上市。这只发生在 ++在查询中,因为使用双特殊字符 ( //, --, $$, etc. ) 的搜索将成功返回。

我尝试使用 Javascript RegExp功能来完成这个,但是我是正则表达式的新手,并且确信这是我的问题的根源。当前实现

  1. 从输入中获取搜索查询并对其进行编码
  2. 将查询传递给应用 RegExp 的 Controller 功能
  3. 根据数据库查找结果并将结果返回到 JSON 对象中

搜索的 AJAX 调用

function getSearchResults() {
    var query = $("#searchInput").val(); //search value
    if(query === '') {
        return false;
    } else {
        $.ajax({
            url: '/items/search?search=' + encodeURIComponent(query), //url with search query
            type: 'GET',
            dataType: 'json',
            beforeSend: function() {
                $('#loadingOverlay').css('visibility', 'visible');
            },
            success: function(result) {
                $('#itemContentMain').bootstrapTable({data: result});
                $('#itemContentMain').bootstrapTable('load', result);
                $('#loadingOverlay').css('visibility', 'hidden');
            }
        }).fail(function (xhr, ajaxOptions, thrownError){
            alert("The search failed to return results: " + thrownError);
        });
    }
    return false;
}

Controller

itemController.search = function(req, res) {
    var regexEx = new RegExp(req.query.search, "i"); //ignore case
    Item.find({ $or: [{name: regexEx}, {category: regexEx}, {subcategory: regexEx},
        {status: regexEx}, {description: regexEx}]}).exec(function (err, items) {
        if (err) {
            console.log("Error:", err);
        } else {
            console.log("Search returning results");
            res.send(items);
        }
   });
};

我读过 ++ in Regex 是一个所有格量词,这样如果引擎匹配失败,就不会返回并尝试撤消它所做的匹配。但是,当查询到达 RegExp 函数时,它被编码为 /items/search?search=%2B%2B . ++ 时发生了什么在查询中传递,如何减轻它产生的内部服务器错误?

最佳答案

+ 有一个 special meaning并且不能以 ++ 的形式使用。您需要转义正则表达式。

使用这个功能 source :

function escapeRegExp(string) {
  return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}

你可以替换:

var regexEx = new RegExp(req.query.search, "i"); //ignore case

var regexEx = new RegExp(escapeRegExp(req.query.search), "i"); //ignore case
                         ^^^^^^^^^^^^

您可以通过在浏览器的控制台中创建一个简单的正则表达式来轻松地重复错误:/c++/,这将抛出以下消息(可能因浏览器而异):

SyntaxError: nothing to repeat


旁注:允许用户搜索原始输入是一个非常糟糕的主意。

关于javascript - 为什么我的 Regex 使用 "++"而不是任何其他特殊字符组合创建内部服务器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54222271/

相关文章:

基于文件名的 Linux 文件系统正则表达式搜索

用户事件上的 Javascript 断点

regex - 从 sed 加入两个正则表达式

javascript - Rails、jQuery、.js.erb 文件、浏览器不执行的 JS

javascript - 如何获取 svg 文档中嵌入图像的真实(未缩放)大小?!

javascript - 检测字符串中是否存在确切的数字

Python 逻辑运算符正则表达式

Java-正则表达式 : Several matches in same string

javascript - 根据点击的元素切换多个元素的类

javascript - 生成 `git clone` 后将输出流式传输到标准输出