在容忍度为1个字符不匹配的字符串中匹配子字符串(在JS中)

时间:2019-03-19 04:34:49

标签: javascript node.js regex

到目前为止,对于C语言,此问题已成功回答,但对于JS,尚未成功回答。

编写一个函数,该函数可以查找一个字符串是否是另一个字符串的子字符串。请注意,一个字符的不匹配应被忽略。

A mismatch can be an extra character: ’dog’ matches ‘xxxdoogyyyy’  
A mismatch can be a missing character: ’dog’ matches ‘xxxdgyyyy’ 
A mismatch can be a different character: ’dog’ matches ‘xxxdigyyyy’

对于这种特定情况,现有的模糊搜索模块过于复杂且不可预测。如何用JS编写这样的函数?

注意:这是{IV}(@IVlad)(2016)接受的C语言解决方案:

int findHelper(const char *str, const char *substr, int mustMatch = 0)
{
    if ( *substr == '\0' )
        return 1;

    if ( *str == '\0' )
        return 0;

    if ( *str == *substr )
        return findHelper(str + 1, substr + 1, mustMatch);
    else
    {
        if ( mustMatch )
            return 0;

        if ( *(str + 1) == *substr )
            return findHelper(str + 1, substr, 1);
        else if ( *str == *(substr + 1) )
            return findHelper(str, substr + 1, 1);
        else if ( *(str + 1) == *(substr + 1) )
            return findHelper(str + 1, substr + 1, 1);
        else if ( *(substr + 1) == '\0' )
            return 1;
        else
            return 0;
    }
}

int find(const char *str, const char *substr)
{
    int ok = 0;
    while ( *str != '\0' )
        ok |= findHelper(str++, substr, 0);

    return ok;
}


int main()
{
    printf("%d\n", find("xxxdoogyyyy", "dog"));
    printf("%d\n", find("xxxdgyyyy", "dog"));
    printf("%d\n", find("xxxdigyyyy", "dog"));
}

2 个答案:

答案 0 :(得分:1)

您可以使用正则表达式生成器来执行此操作

编辑:添加另一个测试用例

编辑#2:,如@amadan建议,添加?。对于字符插入方案

var txtToSearch = 'dog';
function find(txt,src) {
  // generate regex for all possibilities. for this case, it will generate "d?.?og|do?.?g|dog?.?" -> double .? are for 1 char insertion 
  var re = new RegExp(txt.split('').map(function(a,b,c){ return txt.substr(0, b)+a+'?.?'+ txt.substr(b+1);}).join('|'),'gi');
  return src.match(re)!=null
}

// test cases
console.log('"'+txtToSearch+'" in : xxxdoogyyyy -> '+find(txtToSearch,'xxxdoogyyyy'));
console.log('"'+txtToSearch+'" in : xxxdgyyyy -> '+find(txtToSearch,'xxxdgyyyy'));
console.log('"'+txtToSearch+'" in : xxxdigyyyy -> '+find(txtToSearch,'xxxdigyyyy'));
console.log('"'+txtToSearch+'" in : xxxggoodyyyy -> '+find(txtToSearch,'xxxggoodyyyy'));

// another test case
console.log('"great" in : xxzzgreetsxxy -> '+find('great','xxzzgreetsxxy'));
console.log('"greetings" in : xxzzgreextingssxxy-> '+find('greetings','xxzzgreextingssxxy'));

答案 1 :(得分:0)

我创建了自己的版本,它还会从输入中删除特殊字符,以防万一我们在编写可以匹配所有内容的“ ...”时不希望有额外的匹配项。

.localEulerAngles