我有下一个功能:
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;
}
}
但它不能作为第一个版本。第二个函数我做错了什么?
答案 0 :(得分:4)
但它不能作为第一个版本
嗯不,你改变了逻辑。你没有说第二个版本是如何工作的确切错误(或者它是否给你一个错误?)所以很难确切地说出错了什么。但我会猜一猜。
在第二个版本中,您首先检查长度,如果该测试通过,立即返回name
而不进行任何进一步的测试。如果你还需要测试正则表达式,那么要么使用第一个版本的&&
语法,要么将第二个测试嵌套在第一个if块中。
它还检查字符串是否包含任何特殊字符或数字(空格除外),如果确认上述任何一项,则返回默认字符串,如果不是字符串。
实际上,这不是你所拥有的正则表达式。这是你的:
!(/\s[^a-z]/i.test(name))
正则表达式正在测试name
是否包含空白字符,后面紧跟任何非字母字符,然后其结果是不应用!
。因此,如果您的字符串包含不会立即跟随空格的非字母字符,则无法找到它们。如果您的目标是测试字符串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
参数,因为字符串具有内置的长度属性:您可以使用name.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)
语句。
答案 1 :(得分:1)
首先,你真的不需要else
,如果你的第一个条件是true
,函数将返回name
并停止,所以第一个改进将是:< / p>
var checkNameLenght = function(name,nameLenght,allowedLenght,defaultName) {
if((nameLenght <= allowedLenght) && !(/\s[^a-z]/i.test(name))) {
return name;
}
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;
}
现在,您想首先检查长度,您需要执行以下操作:
var checkNameLenght = function(name,nameLenght,allowedLenght,defaultName) {
if(nameLenght <= allowedLenght) {
if( !(/\s[^a-z]/i.test(name)) ) {
return name;
}
}
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;
}
目前尚不清楚是否希望else
仅在nameLength
较大或正则表达式匹配时执行,因此您可能需要相应地编辑我的代码。
答案 2 :(得分:1)
使用来自 nnnnnn 的一些想法,我认为你的意思是这样的
var checkName = function(name, allowedLength, defaultName) {
if (name.length > allowedLength) {
if (opts.debug == true) {
console.log(name + ' is to long | Please choose a name up to ' + allowedLength + ' characters');
}
return defaultName;
}
else if (/[^a-z\s]/i.test(name)) {
if (opts.debug == true) {
console.log(name + ' contains special characters or numbers | Please remove any character or number');
}
return defaultName;
}
else {
return name;
}
}
答案 3 :(得分:1)
你的第一种方法是正确的。它不会同时检查
在Javascript A&amp;&amp; B的工作原理如下:
所以你的第一种方法是正确的。 就像@nnnnnn所说的问题是正则表达和条件。 由于这两个条件必须是真的,它应该是
if(name.length <= allowedLength && /^[a-z\s]*$/i.test(name)) {
return name;
}else{
....
}
如果你给
if(nameLenght <= allowedLenght) {
return name;
}else if( !(/\s[^a-z]/i.test(name)) ){
return name;
}
else {
....
}
当前两个条件中的任何一个变为真时,它将返回name
,这不是您的要求。