2017-02-27 28 views
1

我有以下正则表达式/[a-zA-Z0-9_-]/,并且当字符串只包含从az较低的字符时,我需要返回false和大写字母,数字和_-正则表达式/ [a-zA-Z0-9 _-] /当通过`!!!`时返回true

  • 我的代码有什么问题?
  • 您能否给我提供一个简单的解释和一个关于如何解决它的代码示例?

//var str = 'EKyirtVHsK0'; ok 
 
var str = '!%!irtVHsK0'; // should return false 
 
var result = /[a-zA-Z0-9_-]/.test(str); 
 
alert(result);

+0

你要逃避'-'字符类 – hindmost

+3

@hindmost内:只有在一个位置,它可以形成一个范围内使用。也就是说,不是在字符类的开始/结束处,而是在有效范围之后。 –

+0

你说过,当字符串只包含数字,a-z,'_'和'-'时,你应该得到'false'。你的例子中的字符串也包含其他字符,所以它应该像返回true一样。它不应该返回'false'。 –

回答

7

你的字符串包含与您的正则表达式查找部分匹配匹配的符号。事实上,如果你使用str.match(/[a-zA-Z0-9_-]/),你会看到你匹配i

添加锚和量词:

/^[a-zA-Z0-9_-]*$/ 
^    ^^ 

或者,如果1+字符在输入要求:

/^[a-zA-Z0-9_-]+$/ 
      ^
-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(我)匹配,并返回true。由于^与字符串的开始匹配,并且$与末尾匹配,所以在开始时使用^并在表达式末尾使用$,您强制它完全匹配整个字符串的内容。

/^[a-zA-Z0-9_-]$/匹配由从a到z,A到Z,0到9,连字符或下划线中的任何单个字符组成的字符串,因此它会匹配'3','b','E',' - '或'_'而不是'ab'或'er',因为在这种情况下,^$将字符串限制为只有一个字符。

要测试由特定数量的这些字符组成的字符串,必须引入一个星号(如果字符串可以为空)或加号(如果它必须至少包含一个字符)。所以/^[a-zA-Z0-9_-]+$/只有在字符串完全由表达式中的字符范围组成时才返回true。

您也可以不设使用i标志,它告诉表达式不区分大小写的比赛,留给你/^[a-z0-9_-]+$/i作为最终表达A-Z部分。

2

如果一个字符其他比指定的人发现你可以检查并返回true如果这样做:

console.log(isValid("!%!irtVHsK0")); 
 
console.log(isValid("char09_-")); 
 

 
function isValid(str) { 
 
    return str.match(/[^a-zA-Z0-9_-]/) !== null; 
 
}

[...]匹配特定的字符。
[^...]排除特定的字符。

在这种情况下,匹配/[^a-zA-Z0-9_-]/一个字符不是a-zA-Z0-9_-

match()方法将返回指定的模式或所有的第一次出现,如果启用了全局标志。如果没有找到,则返回null

str.match(/[^a-zA-Z0-9_-]/g); // "g" enables the global flag 

请注意,^帽子符号具有时,它不是方括号像[^...]内不同的含义。如果在外面,则表示字符串的开始。

我会建议您访问this page学习正则表达式,它很容易。你也可以使用this来测试你的正则表达式。

5

你的代码没有问题。只有你的期望是有点关闭。

RegExp.test()说明文档中提到:

使用test(),每当你想知道的模式是否在字符串中找到(类似于String.prototype.search()方法[...])

test()方法不会验证您的整个字符串是否与正则表达式匹配,但只有匹配它的子字符串。

在其当前形式中,您的代码检查如果字符串包含从所述范围内的至少一个字符(字母,数字,或减短划线)。

如果您需要检查匹配对整个字符串,你应该使用boundaries(也许一quantifier):

/^[a-zA-Z0-9_-]+$/ 
  • ^字符串的开头匹配;
  • $匹配字符串的结尾;
  • +表示之前的表达式匹配一次或多次;以前的表达式是[...]范围。

此更新后的表达式与仅包含字母,数字,破折号和小数且不为空的字符串匹配;使用*而不是+以允许空字符串; *使以前的表达式匹配零次或多次。


更新:

一个更好的办法是把^为范围的第一个字符并解释由test()周围的其他方法的返回值。 ^否定范围块的含义([...])。 [^a-zA-Z0-9_-]匹配任何不是字母,数字,短划线或逗号的字符。

我需要返回false当字符串只包含字符从az较低和大写字母,数字和_-

的正则表达式/[^a-zA-Z0-9_-]/是有效的满足您的需求(它至少包含一个字符不能是字母,数字,破折号或逗号)匹配的字符串。

var re = /[^a-zA-Z0-9_-]/ 
alert('Valid: ' + re.test('EKyirtVHsK0'));    // false 
alert('Valid: ' + re.test('!%!irtVHsK0'));    // true