【问题标题】:Regex pattern to match at least 1 number and 1 character in a string正则表达式模式匹配字符串中至少 1 个数字和 1 个字符
【发布时间】:2011-10-07 08:36:19
【问题描述】:

我有一个正则表达式

/^([a-zA-Z0-9]+)$/

这只允许字母数字,但如果我只插入数字或只插入字符,那么它也接受它。我希望它像字段一样工作,应该只接受字母数字值,但该值必须至少包含 1 个字符和 1 个数字。

【问题讨论】:

  • 包含特殊字符可以吗?

标签: javascript regex validation


【解决方案1】:

为什么不先应用整个测试,然后为字符和数字添加单独的测试?无论如何,如果您想在一个正则表达式中完成所有操作,请使用积极的前瞻:

/^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]+)$/

【讨论】:

  • 这比以下解决方案更好:如果您想添加连字符和下划线检查,这仍然可以解决。例如:^(?=.*[0-9])(?=.*[a-z])([a-z0-9_-]+)$abc-d12345
  • 非常感谢您对思考方式的回答和解释
  • 这很好地解释了环视是如何工作的:regular-expressions.info/lookaround.html
  • 亲爱的@phihag,正如你所说,在stackoverflow.com/questions/44528450/…
  • 警告:此正则表达式将在包含特殊字符的字符串上失败。它只匹配包含字母和数字的字符串。它不包含包含字母、数字和特殊字符的字符串。
【解决方案2】:

这个 RE 会做:

/^(?:[0-9]+[a-z]|[a-z]+[0-9])[a-z0-9]*$/i

RE的解释:

  • 匹配以下任意一项:
    1. 至少一个数字,然后是一个字母
    2. 至少一个字母,然后是一个数字
  • 任何剩余的数字和字母

  • (?:...) 创建一个未引用的组
  • /iignore-case 标志,因此 a-z == a-zA-Z

【讨论】:

  • 为什么我们需要区分大小写?
  • 末尾的 /i 使其不区分大小写。
  • 在您的代码中,您提到了a-zA-Z。我昨天做了一些测试,推断/[a-z]/i/[a-zA-Z]/ 稍快。见:jsperf.com/regexp-a-z-i-vs-a-za-z
  • @RobW 链接页面上显示的数据与您的声明冲突。在 Chrome 上,/[a-zA-Z]/ 似乎更快。但这无论如何都是一种愚蠢的测试,而且性能首先并不重要。
  • 如果您想为此添加连字符和下划线检查,您的正则表达式将在字母/数字对之前使用任何连字符或下划线中断。例如:^(?:[0-9]+[a-z]|[a-z]+[0-9])[a-z0-9_-]*$abc-d12345
【解决方案3】:

我可以看到其他响应者已经为您提供了完整的解决方案。正则表达式的问题在于它们可能难以维护/理解。

一个更简单的解决方案是保留您现有的正则表达式,然后创建两个新的正则表达式来测试您的“至少一个字母”和“至少一个数字”。

所以,测试一下:-

/^([a-zA-Z0-9]+)$/

然后这个:-

/\d/

然后这个:-

/[A-Z]/i

如果你的字符串通过了所有三个正则表达式,你就有了你需要的答案。

【讨论】:

  • 我真的很喜欢它的简单性。阅读和维护要容易得多。
  • 你好 Paul.. 我正在寻找一个只有数字 [0-9] 和两个空格字符 [.,] 然后是 'ml' 的正则表达式 - 至少应该有一个数字.. 你的解决方案看起来不错,但我无法编写确切的正则表达式。我试过这个: .match(/(?=.*\d)[0-9][,.]{1,5} ml/g) 。它不工作。你能帮帮我吗?
  • 美丽而天才。这应该是公认的答案。
【解决方案4】:

虽然接受的答案是正确的,但我发现这个正则表达式更容易阅读:

REGEX = "([A-Za-z]+[0-9]|[0-9]+[A-Za-z])[A-Za-z0-9]*"

【讨论】:

    【解决方案5】:

    接受的答案无效,因为不允许输入特殊字符。

    它非常适合我。

    ^(?=.*[0-9])(?=.*[a-zA-Z])(?=\S+$).{6,20}$

    • 一位必须
    • 一个字符必须(小写或大写)
    • 其他一切可选

    谢谢。

    【讨论】:

    • 来自问题:the field should accept only alphanumeric values
    • 匹配字符串中至少 1 个数字和 1 个字符的正则表达式模式 表示至少必须是字母数字,但其他所有内容都可以,无论您输入与否。
    • 重读问题。第二行:the field should accept only alphanumeric values
    • 重读第一行:if I insert only number(s) or only character(s) then also it accepts,但他希望两者都必须。所以我觉得我的回答没有错。
    • 他们说他们实际的正则表达式只接受数字或只接受字母,但他们想要至少 1 个数字和 1 个字母 AND 只接受字母数字。公认的答案是 7 年前给出的,它似乎回答得很完美。但是你可以想象你想要什么。祝你有美好的一天。
    【解决方案6】:

    此解决方案接受至少 1 个数字和至少 1 个字符:

    [^\w\d]*(([0-9]+.*[A-Za-z]+.*)|[A-Za-z]+.*([0-9]+.*))
    

    【讨论】:

      【解决方案7】:

      可能有点晚了,但这是我的回复:

      /^(\w*(\d+[a-zA-Z]|[a-zA-Z]+\d)\w*)+$/

      解释:

      \w* -> 0 个或多个字母数字,在开头

      \d+[a-zA-Z]|[a-zA-Z]+\d -> 一个数字 + 一个字母或一个字母 + 一个数字

      \w* -> 0 个或多个字母数字,再次

      希望可以理解

      【讨论】:

        【解决方案8】:

        还有一个带有否定检查的想法。

        /^(?!\d*$|[a-z]*$)[a-z\d]+$/i
        
        • ^(?! 在开始时 look ahead 如果字符串 没有
        • \d*$ 仅包含数字 |
        • [a-z]*$ 只包含字母
        • [a-z\d]+$ 匹配一个或多个字母或数字,直到 $ 结束。

        Have a look at this regex101 demo

        i flag turns on caseless matching: a-z 匹配 a-zA-Z

        【讨论】:

          【解决方案9】:

          如果您需要将数字放在任何单词的末尾,这对我有用:

          /\b([a-zA-Z]+[0-9]+)\b/g
          
          • \b 字边界
          • [a-zA-Z] 任意字母
          • [0-9] 任意数
          • “+”无限搜索(显示所有结果)

          【讨论】:

          • 这与 3b1a2b3c4d 不匹配
          猜你喜欢
          • 2011-12-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-24
          • 2010-11-02
          相关资源
          最近更新 更多