【问题标题】:adding dynamic values to regex向正则表达式添加动态值
【发布时间】:2022-01-14 23:56:22
【问题描述】:

我有一个正则表达式,我检查输入是否有 6 位数字。我可以用下面的 refgex 来实现它

/^\d{6}$/gm.test("123456")

我在多个地方都使用过这个正则表达式,所以我想把它变成一个函数

function testNumber(number, digitLength = 6){
  return /^\d{6}$/gm.test(number)
}

现在在某些地方 digitLength 为 3,在某些地方为 4,现在我如何在正则表达式中插入 digitLength 以便我可以传递尽可能多的 digitLength 而不是在正则表达式中硬编码 6。

感谢任何帮助

【问题讨论】:

  • new RegExp(`^\\d{${digitLength}}$`, 'gm').test(number)
  • @CherryDT 是的,模板文字很容易,但是在哪里添加,所以我很困惑,而不会失败正则表达式
  • 所以没有办法在正则表达式字符串中插入变量?
  • @CherryDT 让我试试看会更新

标签: javascript


【解决方案1】:

除了动态正则表达式,您还可以这样做:

function testNumber(number, digitLength = 6){
  return number.length === digitLength // check expected length
    && /^\d+$/.test(number);           // and that it is all digits
}

【讨论】:

    【解决方案2】:

    您正在寻找(您的正则表达式):

    function testNumber(number, digitLength = 6){
      return new RegExp(`^\\d{${digitLength}}$`, 'gm').test(number);
    }
    

    参考:RegExpTemplate literals

    相同,但经过优化:
    正如@Thomas 所注意到的,您不需要g 标志,因为您始终匹配全局(完整字符串),并且您也不需要m 标志,因为您接受单行输入。所以像这样的正则表达式就足够了:

    function testNumber(number, digitLength = 6){
      return new RegExp(`^\\d{${digitLength}}$`).test(number);
    }
    

    【讨论】:

    • 为什么是gm?这里不需要 globalmultiline。我们总是匹配整个字符串。
    • @Thomas 有意义,我会更新答案,谢谢建议!
    猜你喜欢
    • 1970-01-01
    • 2012-07-10
    • 2019-12-05
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 2022-07-20
    相关资源
    最近更新 更多