正则表达式/ [a-zA-Z0-9 _-] /在传递`!!!`

时间:2017-02-27 09:31:20

标签: javascript regex

我有以下正则表达式/[a-zA-Z0-9_-]/,当字符串只包含从az大写,数字和_的字符时,我需要返回false和-

  • 我的代码出了什么问题?
  • 能否请您提供一份简要说明以及如何修复它的代码示例?

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

4 个答案:

答案 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_-]匹配任何不是字母,数字,短划线或逗号的字符。

  

当字符串仅包含从falsea大写,数字以及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

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

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

[...]符合特定字符 此[^...]排除了特定字符。

在这种情况下,/[^a-zA-Z0-9_-]/匹配 a-zA-Z0-9_或{的字符{1}}。

如果启用了全局标志,match()方法将返回指定模式的第一次出现或全部返回。如果找不到任何内容,则返回-

null

请注意,如果str.match(/[^a-zA-Z0-9_-]/g); // "g" enables the global flag 帽子符号不在^等方括号内,则其含义不同。如果它在外面,则表示字符串的开头。

我建议访问this page来学习正则表达式,这很容易。您还可以使用this来测试正则表达式。

答案 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>