目前我正在尝试使用正则表达式来查找用户名。以下条件是我需要的: “用户名匹配搜索字词,最多包含3个错误字符”
例如, 数据库内容:
搜索命令 - >返回比赛:
我可以动态构建我的正则表达式并将其推送到数据库查询。我只能抓住正则表达式本身。你能帮帮我吗?会很好? (或者甚至可能吗?)
答案 0 :(得分:1)
您无法使用正则表达式执行此操作。你需要一些相似度算法来检查两个字符串之间的相似性。
一个好的开始,一个简单的开始是levensthein distance。
简而言之:它计算将字符串A转换为字符串B所需的插入/更新/删除操作数。
几年前我在Javascript中做过这个,但几乎每种编程语言都应该很容易。您可以找到一个有效的示例here:
// http://ejohn.org/blog/fast-javascript-maxmin/
Array.max = function( array ){
return Math.max.apply( Math, array );
};
Array.min = function( array ){
return Math.min.apply( Math, array );
};
// Levenshstein Distance Calculation
function levenshtein_distance (t1, t2) {
var countI = t1.length+1;
var countJ = t2.length+1;
// build empty 'matrix'
var matrix = new Array (countI);
for (var i=0;i<countI;i++) {
matrix[i] = new Array (countJ);
}
// initialize the matrix;
// set m(0,0) = 0;
// m(0,0<=j<countJ) = j
// m(0<=i<countI, 0) = i
matrix[0][0] = 0;
for (var j=1;j<matrix[0].length;j++) {
matrix[0][j] = j;
}
for (var i=1;i<matrix.length;i++) {
matrix[i][0] = i;
}
// calculate the matrix
for (var i=1;i<matrix.length;i++) {
for (var j=1;j<matrix[i].length;j++) {
var costs = new Array ();
if (t1.charAt(i-1) == t2.charAt(j-1)) {
costs.push (matrix[i-1][j-1]);
}
costs.push (matrix[i-1][j-1] + 1);
costs.push (matrix[i][j-1] + 1);
costs.push (matrix[i-1][j] + 1);
matrix[i][j] = Array.min(costs);
}
}
// resultMatrix = matrix;
var result = new Object
result.distance = matrix[countI-1][countJ-1];
result.matrix = matrix;
return result;
}