【问题标题】:Regex length check account for optional group可选组的正则表达式长度检查帐户
【发布时间】:2022-01-13 07:33:32
【问题描述】:
export const validUKPhone = /^(\+)?(44)?(\s*\d){9,11}$/;

我目前有以下电话号码的正则表达式,它正在尝试验证号码的长度。

现在有趣的是,模式的开头有 3 个可选字符。 +44(可能)。

我的问题是如何编写我的正则表达式来考虑这个组,并且只计算数字“主体”的长度。如果 +44 存在,则长度模式将为 {12,14} 否则为 {9,11}

例如以下测试失败。

  expect(regex.test('+440798444')).toBeFalsy();
  expect(regex.test('+440798444457')).toBeTruthy(); 

(由于 +44,当前为 10 个字符,但返回 true)

【问题讨论】:

  • 0798444 是 7 位数字,您至少需要 9 位。
  • 我想你想要:^(?:.{3})?\+?(44)?\d{9,11}$
  • 试试/^(?:\+?44\s*\d|(?!44))(?:\s*\d){9,11}$/
  • @WiktorStribiżew - 这很接近 - 因为它继续满足您在原始正则表达式中发现的空格要求,但未达到预期(regex.test('+44079251345672')).toBeFalsy( );大概与 + 字符有关
  • 您说如果号码以44 开头,则可以有额外的12、13 或14 位数字。为什么+44079251345672 是假的? 079251345672 长度为 12 个字符。

标签: javascript regex


【解决方案1】:

你可以使用

/^(?:\+?44|(?!44))(?:\s*\d){9,11}$/

请参阅regex demo详情

  • ^ - 字符串开头
  • (?:\+?44|(?!44)) - 非捕获组匹配:
    • \+?44 - 一个可选的+,然后是44
    • | - 或
    • (?!44) - (匹配的负前瞻)不紧跟44 的位置(如果您不想匹配数字,即使44 之前/内部有空格,也可以添加\s*)李>
  • (?:\s*\d){9,11} - 九到十一次出现零个或多个空格,然后是一个数字
  • $ - 字符串结束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2022-09-23
    • 2010-11-04
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多