javascript - 需要一些关于正则表达式验证的指示

标签 javascript regex

给定一个字符串,它必须具有以下内容:

  1. 只有一个号码
  2. (@#$*)中只有一个特殊字符
  3. 6个小写字母

字符串可以是以上条件的任意组合,长度必须是8。

例子:

  1. 2@qwerty
  2. 1asddfg

  3. qwe*yt2u
  4. qw2wqia

到目前为止,这是我的正则表达式:

!/^(?=.*[0-9])(?=.*[^a-z])(?=.*[a-z])(?=.*[@#$*])\S{8,}$/.test(string)

它适用于上述情况,但在以下情况下会中断:

  1. 2@2qwert
  2. 2@@qwert

我错过了什么?

最佳答案

What am I missing?

您的测试 '2@2qwert' 和 '2@@qwert' 与您的正则表达式匹配不正确的原因是因为其中没有任何内容需要至少 6 个小写字母。根据对这个问题的其他答案和评论,我会说用 (?=(.*?[a-z]){ 6})

可以进行的其他一些小改进:

  • 您可以删除多余的 (?=.*[^a-z]) 子句,因为所有这一切都是说字符串应该至少包含 1 个非字母,这已经由数字和特殊字符要求。
  • 将 [0-9] 替换为\d。
  • 在字符匹配 (.*) 之前匹配通配符的 3 个位置中,如果将这些设置为非贪婪的,则 RegExp 引擎的速度会稍快一些,这样在搜索字符串时回溯就会更少一场比赛。这是通过放置一个 ?在 * (.*?) 之后。

根据您的正则表达式将其放在一起:

/^(?=.*?\d)(?=(.*?[a-z]){6})(?=.*?[@#$*])\S{8,}$/

这成功匹配了您的前 4 个字符串,但不匹配后 2 个。

(如果您想要可读的验证函数,我的原始回复如下。)

function validate(str)
{
  // test for digit
  if( !/\d/.test(str) ) return false;
  // test for special character
  if( !/[@#$*]/.test(str) ) return false;
  // test for 6 lowercase letters
  var letters = str.match(/[a-z]/g);
  return letters != null && letters.length == 6;
}

var tests = [ '2@qwerty', '#1asddfg', 'qwe*yt2u', '#qw2wqia', '2@2qwert', '2@@qwert' ];
for( var i=0 ; i<tests.length ; ++i )
  document.writeln(tests[i] + ": " + validate(tests[i]) + "<br/>\n");

关于javascript - 需要一些关于正则表达式验证的指示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18474998/

相关文章:

javascript - 当属性值为某物时如何隐藏数据属性

Javascript 用随机数替换正则表达式 - 字符串

regex - 使用 VBA 从文本文件写入 Excel 时保留 "columns"

java - 不区分大小写的正则表达式匹配 à 和 À

javascript - MongoDB $geoNear 距离返回值精度下降

javascript - jQuery 宽度 (%) 不会在 windowResize 上停止计算?

javascript - JS从文本框中抓取文本,传递给asp.net mvc ActionResult,但ActionResult参数显示为空

javascript - 如何避免 React Native 中的 jsx 样式错误?

c# - .NET RegEx 可以在没有 .ToUpper() 的情况下将字母大写吗?

regex - URL 正则表达式精确匹配小数点后 3 个字符