使用正则表达式搜索用户名

时间:2015-05-27 07:16:28

标签: regex

目前我正在尝试使用正则表达式来查找用户名。以下条件是我需要的: “用户名匹配搜索字词,最多包含3个错误字符”

例如, 数据库内容:

  • “名为myUsername”

搜索命令 - >返回比赛:

  • 搜索(“用户名”) - > “MyUsername”
  • search(“Us3rname”) - > “名为myUsername”
  • search(“userName”) - > “MyUsername”
  • 搜索(“MyUser”) - >无(4个字符错误)
  • 搜索(“我的Us3r N @ me”) - >无(4个字符错误)

我可以动态构建我的正则表达式并将其推送到数据库查询。我只能抓住正则表达式本身。你能帮帮我吗?会很好? (或者甚至可能吗?)

1 个答案:

答案 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;
}