我有以下正则表达式/[a-zA-Z0-9_-]/
,当字符串只包含从a
到z
大写,数字和_
的字符时,我需要返回false和-
。
//var str = 'EKyirtVHsK0'; ok
var str = '!%!irtVHsK0'; // should return false
var result = /[a-zA-Z0-9_-]/.test(str);
alert(result);
答案 0 :(得分:7)
您的字符串包含与您的正则表达式匹配的符号,这些符号会找到部分匹配项。事实上,如果您使用str.match(/[a-zA-Z0-9_-]/)
,则会看到您匹配i
。
添加锚点和量词:
/^[a-zA-Z0-9_-]*$/
^ ^^
或者,如果输入中需要1个字符:
/^[a-zA-Z0-9_-]+$/
^
答案 1 :(得分:5)
您的代码没有任何问题。只有你的期望有点偏。
RegExp.test()
的文档提及:
只要您想知道字符串中是否找到某个模式(类似于
test()
方法[...]),就可以使用String.prototype.search()
test()
方法不会验证您的整个字符串是否与正则表达式匹配,但仅当它的子字符串匹配时才会验证。
在当前形式中,您的代码会检查字符串是否包含范围中的至少一个字符(字母,数字,减号或短划线)。
如果你需要检查整个字符串的匹配,你应该使用boundaries(可能还有quantifier):
/^[a-zA-Z0-9_-]+$/
^
匹配字符串的开头; $
匹配字符串的结尾; +
表示前一个表达式匹配一次或多次;此处的上一个表达式是[...]
范围。此更新的表达式匹配仅包含字母,数字,短划线和短号的字符串,并且不为空;使用*
代替+
来允许空字符串; *
使前一个表达式匹配零次或多次。
<强>更新强>
更好的方法是将^
作为范围的第一个字符,并以相反的方式解释test()
返回的值。 ^
否定了范围块([...]
)的含义。 [^a-zA-Z0-9_-]
匹配任何不是字母,数字,短划线或逗号的字符。
当字符串仅包含从
false
到a
大写,数字以及z
和_
的字符时,我需要返回-
。< / p>
与正则表达式/[^a-zA-Z0-9_-]/
匹配的字符串对您的需求有效(它至少包含一个不是字母,数字,短划线或逗号的字符)。
var re = /[^a-zA-Z0-9_-]/
alert('Valid: ' + re.test('EKyirtVHsK0')); // false
alert('Valid: ' + re.test('!%!irtVHsK0')); // true
答案 2 :(得分:2)
您可以检查是否找到了其他而不是指定的,如果有,则返回true
:
console.log(isValid("!%!irtVHsK0"));
console.log(isValid("char09_-"));
function isValid(str) {
return str.match(/[^a-zA-Z0-9_-]/) !== null;
}
&#13;
此[...]
符合特定字符
此[^...]
排除了特定字符。
在这种情况下,/[^a-zA-Z0-9_-]/
匹配不 a-z
,A-Z
,0-9
,_
或{的字符{1}}。
如果启用了全局标志,match()
方法将返回指定模式的第一次出现或全部返回。如果找不到任何内容,则返回-
。
null
请注意,如果str.match(/[^a-zA-Z0-9_-]/g); // "g" enables the global flag
帽子符号不在^
等方括号内,则其含义不同。如果它在外面,则表示字符串的开头。
答案 3 :(得分:-1)
var str = 'EKyirtVHsK0'; // ok
var str2 = '!%!irtVHsK0'; // should return false
var result = /^[a-z0-9_-]+$/i.test(str);
var result2 = /^[a-z0-9_-]+$/i.test(str2);
alert(result);
alert(result2);
如Wiktor Stribizew所述,您正在使用正则表达式进行部分匹配。在这种特殊情况下,它意味着字符串将逐个字符遍历,直到找到匹配或它到达字符串的末尾。使用您的字符串,它将匹配索引3(i),并返回true。在开头使用^
,在表达式结尾使用$
,强制它与整个字符串的内容完全匹配,因为^
匹配字符串的开头$
1}}匹配结束。
/^[a-zA-Z0-9_-]$/
匹配一个字符串,该字符串由a到z,A到Z,0到9,连字符或下划线中的任何单个字符组成,因此它匹配'3','b','E' ,' - '或'_'但不是'ab'或'er',因为^
和$
在这种情况下有效地将字符串限制为仅一个字符。
要测试由特定数量的这些字符组成的字符串,您必须引入星号(如果字符串可以为空)或加号(如果它必须包含至少一个字符)。因此,/^[a-zA-Z0-9_-]+$/
仅在字符串仅由表达式中的字符范围组成时才返回true。
您还可以使用A-Z
标记取消i
部分,该标志告诉表达式执行不区分大小写的匹配,并使用/^[a-z0-9_-]+$/i
作为最终表达式。< / p>