javascript - 改进 JavaScript 功能

标签 javascript regex

我有下一个功能:

var checkNameLenght = function(name,nameLenght,allowedLenght,defaultName) {
    if((nameLenght <= allowedLenght) && !(/\s[^a-z]/i.test(name))) {
        return name; 
    }
        else {
            if(opts.debug == true) {
                console.log(name+' is to long or contains special characters / numbers | Please choose a name shorter than '+allowedLenght+' characters or remove any character / number');
            }
            return defaultName;
        }
}

它的作用是检查某个字符串是否大于或小于允许的长度,并且还检查该字符串是否包含任何特殊字符或数字(空格除外),如果确认以上任何一项,则返回一个默认字符串,如果不是字符串。

但是这个函数同时检查长度和正则表达式,if((nameLenght <= allowedLenght) && !(/\s[^a-z]/i.test(name))) { ... } ,但我不希望这样,我希望它首先检查长度,然后检查正则表达式。

我尝试过这样的:

var checkNameLenght = function(name,nameLenght,allowedLenght,defaultName) {
    if(nameLenght <= allowedLenght) {
        return name; 
    }
        else if( !(/\s[^a-z]/i.test(name)) ){
            return name;

        }
            else {
            if(opts.debug == true) {
                console.log(name+' is to long or contains special characters / numbers | Please choose a name shorter than '+allowedLenght+' characters or remove any character / number');
            }   
            return defaultName;
            }
}

但它不能像第一个版本一样工作。我对第二个函数做错了什么?

最佳答案

But it doesn't work as the first version

好吧,不,你改变了逻辑。您没有说第二个版本的工作方式到底出了什么问题(或者它是否给您带来了错误?),所以很难确切地说出了什么问题。但我会猜测一下。

在第二个版本中,您首先检查长度,如果该测试通过,您将立即返回name,而不进行任何进一步的测试。如果您也需要测试正则表达式,则可以使用第一个版本中的 && 语法,或者将第二个测试嵌套在第一个 if block 内。

it also checks if the string contains any special characters or numbers ( except white space ) and if any of the above is confirmed it returns a default string, if not the string.

实际上,这不是您的正则表达式所做的。这是你的:

!(/\s[^a-z]/i.test(name))

该正则表达式正在测试 name 是否包含空格字符,后跟任何非字母字符,然后其结果应用了 not ! 。因此,如果您的字符串包含不立即跟在空格后面的非字母字符,则不会找到它们。如果您的目标是测试字符串中任意位置的非字母 A-Z 或空格的任何字符,请尝试以下操作:

!(/[^a-z\s]/i.test(name))

或者不寻找无效字符,只需测试整个字符串是否由有效字符组成:

/^[a-z\s]*$/i.test(name)          // note: you don't need the ! for this

//  ^        - match beginning of string
//  [a-z\s]* - match zero or more alphabet or white space characters
//  $        - match end of string

此外,您不需要 nameLenght 参数,因为字符串具有内置的 length 属性:您可以使用相同的 name.length。 (显然,这不会停止该功能的工作,但它有点不整洁。)

(此外,您还拼错了“length”,但您似乎在每个变量名称中都这样做了,因此它不会造成问题。但是。)

编辑:根据您的评论工作的新版本:

var checkName = function(name, allowedLength, defaultName) {
        if(name.length > allowedLength) {
           console.log("Name is more than allowed length");
           return defaultName;
        }
        if( /[^a-z\s]/i.test(name) ){
           console.log("Name contains special characters or numbers");
           return defaultName;
        }

        // tests passed
        return name;
};

注意:您不需要任何 else 语句,因为每个 if 都会从函数中返回。显然,您可以删除我放入的 console.log() 语句,也可以像原来那样添加 if(opt.debug) 语句。

关于javascript - 改进 JavaScript 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8869418/

相关文章:

javascript - Node JS 避免费力地将 "use strict"添加到我的所有文件中

javascript - 如何用 d3 表示可变嵌套深度的数组

regex - grep 命令模式中插入符号的不同位置?

r - 有选择地删除尾随字符串

使用 RegExp 的 Javascript 正则表达式匹配

javascript - 如何在 jQuery 的对象中指定带有 on 事件组合的目标元素

javascript - Jsonp回调函数不起作用?我这样做错了吗?

javascript - 这但不是 $(this)

java - 需要正则表达式帮助

正则表达式,编写玩具编译器,解析,注释删除器