-1

我正在尝试在不使用正则表达式的情况下完成以下操作:

match("abcdef","@C2D!") 返回真

匹配(“abcdef”,“CAfe”)返回真

匹配(“abcdef”,“CG”)返回假

这是我到目前为止的代码 - jsfiddle:http: //jsfiddle.net/5UCwW/1/

var re = /[^A-Za-z]/g;

function match(string, pattern) {
    string = string.toLowerCase();
    pattern = pattern.toLowerCase().replace(re, "");
    for (var i = 0, l = string.length; i < l; ++i) {
        if(pattern.indexOf(string[i]) === -1) return false;
    }
    return true;
}

alert(match("abcdef", "@C2D!"));
4

2 回答 2

1

这是一个根据要求不使用正则表达式的解决方案:

function testAllowedLetters(allowedString, testString) {
    var i, allowedLetters;

    allowedString = allowedString.toLowerCase();
    allowedLetters = {a:0,b:0,c:0,d:0,e:0,f:0,g:0,h:0,i:0,j:0,k:0,l:0,m:0,n:0,o:0,p:0,q:0,r:0,s:0,t:0,u:0,v:0,w:0,x:0,y:0,z:0};
    for (i = 0; i < allowedString.length; i++) {
        allowedLetters[allowedString[i]] = 1;
    }

    testString = testString.toLowerCase();
    for (i = 0; i < testString.length; i++) {
        if (allowedLetters[testString[i]] === 0) {
            return false;
        }
    }

    return true;
}

console.log(testAllowedLetters("abcdef", "@C2D!")); // true
console.log(testAllowedLetters("abcdef", "CG")); // false

jsFiddle 演示

首先,我们从第一个参数创建一个allowedLetters对象,作为所有小写字母 a 到 z 的子集。然后我们遍历第二个参数中的字符,false如果找到不允许的字符则返回。否则我们返回true

于 2013-11-09T20:24:09.567 回答
0

另一种解决方案:

function match(allowed, str) {
    str = str.toLowerCase();
    allowed = allowed.toLowerCase();
    for (var i = 0, l = str.length; i < l; i++) {
        if (!isAllowed(str[i], allowed)) {
            return false;
        }
    }
    return true;
}

function isAllowed(c, allowed) {
    // "char is not a letter OR char is allowed"
    return !isLetter(c) || allowed.indexOf(c) !== -1;
}

function isLetter(c) {
    c = c.charCodeAt(0);
    // "char >= a AND char <= z OR char >= A AND char <= Z"
    return c >= 97 && c <= 122 || c >= 65 && c <= 90;
}
于 2013-11-10T07:04:30.503 回答