![](/img/trans.png)
[英]How to match numbers followed by any combination of special characters and spaces using regex
[英]Why does my Regex create an internal server error with “++” but not any other combination of special characters?
我正在嘗試創建一個基本搜索,它將返回Mongo數據庫的結果。 查詢應匹配值為完整值或值。 例如,搜索C
應該返回C, C#, C++
。 此外, Java
應該返回Java, Javascript
。 我有一個簡單的實現當前設置可以實現這一點,但是如果我搜索查詢C++
,我返回內部服務器錯誤。 搜索C+
將返回列出C++
的成功搜索。 這僅在查詢中使用++
時發生,因為具有雙特殊字符( //, --, $$, etc.
)的搜索將成功返回。
我曾嘗試使用Javascript RegExp
函數來完成此任務,但我是regex的新手,並且我確信這是我的問題所在。 目前的實施
RegExp
函數的控制器 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;
}
調節器
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);
}
});
};
我已經讀過Regex中的++
是一個占有量詞,所以如果引擎失敗匹配,就不會回去嘗試撤消它所做的匹配。 但是,當查詢到達RegExp函數時,它被編碼為/items/search?search=%2B%2B
。 在查詢中傳遞++
時會發生什么,以及如何緩解它產生的內部服務器錯誤?
+
在正則表達式中有特殊含義 ,不能以++
格式使用。 你需要逃避正則表達式。
使用此功能來源 :
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:沒有什么可重復的
旁注 :允許用戶搜索原始輸入是一個非常糟糕的主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.