【问题标题】:Javascript: Regex to exclude whitespace and special charactersJavascript:正则表达式排除空格和特殊字符
【发布时间】:2020-05-09 06:04:46
【问题描述】:

我需要一个正则表达式来验证,

  1. 长度应为 18
  2. 前 5 个字符应为 (xyz34|xyz12)
  3. 其余 13 个字符只能是字母数字字母和数字,不允许使用空格或特殊字符。

我有一个像这里这样的模式,'/^(xyz34|xyz12)((?=.*[a-zA-Z])(?=.*[0-9])){13}/g'

但这是允许空格和特殊字符(如($、% 等))违反规则 #3。

有什么建议可以排除这个空格和特殊字符并严格检查它必须是字母和数字吗?

【问题讨论】:

  • 你不需要前瞻,只需要/^(xyz34|xyz12)[a-zA-Z0-9]{13}$/
  • 问题是.* 意味着任何东西都是有效的。
  • 你为什么要测试.*然后一些字符类?你的意思是[a-zA-Z]*[0-9]* 吗?为什么这些分成两部分? (?=…) 是零宽度匹配;它不能有 13 个字符。所有这些都应该更像/^xyz(?:34|12)[a-zA-Z0-9]{13}$/
  • 哦,你不应该量化环视。它们是非消耗模式,即连续的正向前瞻检查它们的模式是否存在但不推进正则表达式索引,它们检查相同位置的文本。重复它们 13 次是没有意义的。 ^(xyz34|xyz12)((?=.*[a-zA-Z])(?=.*[0-9])){13} = ^(xyz34|xyz12)(?=.*[a-zA-Z])(?=.*[0-9]),表示该字符串可以以xyz34xyz12 开头,然后至少应包含1 个字母和1 个数字。

标签: javascript regex


【解决方案1】:

您不应该量化环视。它们是非消耗模式,即连续的正向前瞻检查它们的模式是否存在,但不推进正则表达式索引,它们检查同一位置的文本。重复它们 13 次是没有意义的。 ^(xyz34|xyz12)((?=.*[a-zA-Z])(?=.*[0-9])){13} 等于^(xyz34|xyz12)(?=.*[a-zA-Z])(?=.*[0-9]),表示字符串可以以xyz34xyz12 开头,然后至少应包含1 个字母和1 个数字。

您可以考虑使用这样的消费模式来解决问题:

  • 如果您不关心最后 13 个字符是仅包含数字还是仅包含字母,请使用其他用户建议的模式,例如 /^(?:xyz34|xyz12)[a-zA-Z\d]{13}$//^xyz(?:34|12)[a-zA-Z0-9]{13}$/
  • 如果这 13 个字母数字字符中必须至少有 1 个数字和至少 1 个字母,请使用 /^xyz(?:34|12)(?=[a-zA-Z]*\d)(?=\d*[a-zA-Z])[a-zA-Z\d]{13}$/

请参阅regex demo #1regex demo #2

注意:这些是正则表达式文字,请勿在单引号或双引号内使用它们!

详情

  • ^ - 字符串开头
  • xyz - 一个通用前缀
  • (?:34|12) - 匹配 3412 的非捕获组
  • (?=[a-zA-Z]*\d) - 当前位置右侧的任何 0+ 个字母后必须至少有 1 个数字
  • (?=\d*[a-zA-Z]) - 当前位置右侧的任何 0+ 数字后必须至少有 1 个字母
  • [a-zA-Z\d]{13} - 13 个字母或数字
  • $ - 字符串结束。

JS 演示:

var strs = ['xyz34abcdefghijkl1','xyz341bcdefghijklm','xyz34abcdefghijklm','xyz341234567890123','xyz14a234567890123'];
var rx = /^xyz(?:34|12)(?=[a-zA-Z]*\d)(?=\d*[a-zA-Z])[a-zA-Z\d]{13}$/;
for (var s of strs) {
  console.log(s, "=>", rx.test(s));
}

【讨论】:

  • 感谢您的清晰解释。整洁地工作和理解。
【解决方案2】:

.* 将匹配任何字符串,根据您的要求,您可以使用:

/^xyz(34|12)[a-zA-Z0-9]{13}$/g

正则表达式fiddle

【讨论】:

    【解决方案3】:
    /^(xyz34|xyz12)[a-zA-Z0-9]{13}$/
    

    这应该可行,

    • ^ 在行首断言位置
    • 第一个捕获组 (xyz34|xyz12)
      • 1st Alternative xyz34 匹配字符 xyz34 的字面意思(区分大小写)
      • 2nd Alternative xyz12 匹配字符 xyz12 的字面意思(区分大小写)
    • 匹配以下列表中的单个字符 [a-zA-Z0-9]{13}
    • {13} 量词 - 精确匹配 13 次

    【讨论】:

      猜你喜欢
      • 2018-10-11
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多