【问题标题】:Regular expression to match a certain number of digits anywhere in a string正则表达式匹配字符串中任意位置的一定数量的数字
【发布时间】:2015-08-14 19:36:08
【问题描述】:

我正在尝试使用 Angular 的 ng-pattern 属性来强制输入框中的文本与特定的正则表达式匹配。我这样做是为了进行表单验证。我正在使用的输入是电话字段。电话字段可以接受 10 位数的电话号码,但我不想要求我的用户使用特定格式,除非它必须在某处包含一个 10 位数的号码。所以这些都是有效的。

  • 555-555-5555
  • (555) 555-5555

在后端,我将删除所有格式并存储原始数字。过去为此我所做的是删除所有非数字字符,然后确保长度 == 10。这很简单,只需几行代码即可完成,但它是正则表达式可以处理的吗?这不是我曾经试图让正则表达式做的事情。我不想支持特定的格式,因为我不在乎他们是否不小心输入了额外的空格,或者他们是否想像这样输入他们的电话号码:55-55-55-55-55。对我来说真的没关系,我只想让正则表达式匹配,如果字符串中有 10 个数字并且没有更多的数字。

感谢大家的帮助!

【问题讨论】:

  • 为什么不允许只允许数字,然后应用一致的格式,例如在这个kendo UI masked textbox 示例中。这样,用户就不必应用格式,而且您始终确切知道您将收到什么格式。
  • 对于@stribizhev 的方法,我认为(\d\D*?){10} 更好。
  • 不错@Shadowen 我应该考虑做一个重复的捕获组。把它作为答案,我会这样标记它。
  • 不幸的是,@stribizhev 是正确的。如果字段中有 > 20 个数字,则正则表达式会在一行中捕获两个单独的组。您将需要一个稍微复杂的正则表达式。

标签: regex angularjs


【解决方案1】:

要使用正则表达式在字符串中只允许 10 位数字,不多不少,您可以使用

^(?:\D*\d){10}\D*$

请参阅 demo\D 替换为 [^\d\n] 以排除换行符,仅用于演示)。

(\d\D*?){10} 正则表达式将在超过 10 位数字的字符串中找到匹配项。

【讨论】:

    【解决方案2】:
    ^(?!(?:.*?\d){11,})[^a-zA-Z\n]+$
    

    试试这个。查看演示。

    https://regex101.com/r/iQ4nW0/1

    【讨论】:

      【解决方案3】:

      您可以为其制作属性类型指令并使用动态正则表达式设置有效性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-01
        • 1970-01-01
        • 2023-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-03
        相关资源
        最近更新 更多