0

我有一个characters包含允许字符的字符串。我想检查另一个字符串 ( input),如果它仅具有来自characters.

如果可能,我不反对,而是寻找一种解决方案,该解决方案使用regexmatch()确定输入是否仅包含允许的字符。

4

4 回答 4

2

您可以使用RegExp构造函数从字符串创建正则表达式:

function validStringUnsanitized(allowed, str) {
    var re = new RegExp("^[" + allowed + "]+$");
    return re.test(str);
}

> validStringUnsanitized('abx', 'abx');
true
> validStringUnsanitized('abx', 'ght');
true

但是如果你想允许特殊字符,你需要清理允许的字符。否则你会得到不需要的结果:

// the regex becomes [ab-x] which is from a to x
> validStringUnsanitized('ab-x', 'ghai');
true
> validStringUnsanitized(']ab', 'ab');
false

所以你必须像这样逃避一些字符:

function validString(allowed, str) {
    var sanitized = allowed.replace(/([\]\-\\])/g, '\\$1')
    var re = new RegExp("^[" + sanitized + "]+$");
    return re.test(str);
}

> validString(']ab-x\\[', 'abxaabbx');
true
> validString(']ab-x\\[', 'ab-\\xb[]ab');
true
> validString(']ab-x\\[', 'ghai');
false

JSFiddle

于 2013-06-27T10:10:58.190 回答
1

JS小提琴

试一试。当测试字符串仅包含允许的字符时,成功将为真。这是区分大小写的。

var allowedCharacters = "abcdefghijklmnopqrstuvwxyz";
var regex = new RegExp("^[" + allowedCharacters + "]*$");
var testString = "abc#@#";
var success = regex.test(testString);

对于不区分大小写的情况,将相应的行替换为以下内容。这添加了一个正则表达式修饰符。

var regex = new RegExp("^[" + allowedCharacters + "]*$", "i");

如果您的 allowedCharacters 变量中有特殊字符,则必须使用双斜杠对其进行转义。因此,要允许方括号字符也必须使用。

var allowedCharacters = "abc\\[";

这是因为第一个反斜杠用于字符串转义,第二个反斜杠用于正则表达式中的转义。

于 2013-06-27T10:11:00.343 回答
1

如果您希望避免使用正则表达式,您可以考虑以下内容:

var valid_chars = ['a', 'e', 'i', 'o', 'u', 'y'],
    ret;

//or valid_chars = string.split('');

ret = isValid('test', valid_chars);   //false
ret = isValid('aeyaa', valid_chars);  //true
ret = isValid('aeyaab', valid_chars); //false

function isValid(input, check)
{
    if (typeof input === 'string')
        input = input.split('');

    if (typeof check === 'string')
        check = input.split('');

    if (typeof input !== 'object')
    {
        console.log('isValid() failed: input not array');
        return;
    }

    if (typeof check !== 'object')
    {
        console.log('isValid() failed: check not array');
        return;
    }


    for (var x = 0; x < input.length; ++x)
    {
        var char_isvalid = false;

        for (var y = 0; y < check.length; ++y)
        {
            if (input[x].toLowerCase() === check[y].toLowerCase())
            {
                char_isvalid = true;
                break;
            }
        }

        if (! char_isvalid)
        {
            return false;
        }
    }

    return true;
}
于 2013-06-27T10:30:21.707 回答
0

你可以用这个功能做到这一点

http://jsfiddle.net/SXeTJ/

var allowed = 'abcdef';

function CheckAllowedWithRegex(str,allowed){
   var pattern = new RegExp("[^"+allowed+"]");
   return str.match(pattern) == null;
}

var str1 = 'aaabcc';
var str2 = 'aavbllkwqxx';

alert(  CheckAllowedWithRegex(str1,allowed ) ); // output is true

alert(  CheckAllowedWithRegex(str2,allowed ) ); // output is false
于 2013-06-27T10:21:33.573 回答