代码之家  ›  专栏  ›  技术社区  ›  Stevie Star

javascript-如何检查regex以确保字符串至少包含一个字母/数字序列?

  •  0
  • Stevie Star  · 技术社区  · 7 年前

    我正试图找出正确的regex来检测一个看起来像 2d1h30m10s 其中任何一个都是有效的,例如 1h 1h30m 30m 10s 或者这些的任何组合。Regex是正确的工具吗?

    我试着去理解它,无论我做什么,我都会不断地 false 回到这些不同的测试:

    /^(0?[1-9]|1[0-2][h])([1-6][0-9][m])([1-6][0-9][s])\d$/.test('2d1h10m10s')
    /^(0?[1-9]|1[0-2][h])([1-6][0-9][m])([1-6][0-9][s])\d$/.test('10m10s')
    /^(0?[1-9]|1[0-2][h])([1-6][0-9][m])([1-6][0-9][s])\d$/.test('10s')
    

    我这里缺什么?

    4 回复  |  直到 7 年前
        1
  •  1
  •   Barmar    7 年前

    您需要使regexp的每个部分都是可选的,这样就可以省略该单元。

    你需要 [h] 在一个备选方案中——你匹配 12h 但不是 01h .

    你不应该 \d 最后。

    您不允许使用一位数的分钟或秒。也不需要60秒或60米,因为这是1米1小时。

    /^((0?[1-9]|1[0-2])h)?([1-5]?[0-9]m)?([1-5]?[0-9]s)?$/
    

    DEMO

    没必要放 h , m s 在方括号内,因为它们只是单个字符。

    注意,由于每个单元都是可选的,所以这也将匹配空字符串。您应该从regexp中单独检查这一点。

        2
  •  0
  •   duc mai    7 年前

    也许这个能用

    \d+\w+
    

    如果我正确地理解您试图测试的字符串包含数字后的字符

        3
  •  0
  •   Thomas Skubicki    7 年前

    尝试:

    ^(\d{0,2}[hms]){0,3}$
    

    实例: https://regex101.com/r/NV6oEu/1

        4
  •  0
  •   do or do not    7 年前

    我想你要找的表达方式是:

    /^((0?[1-9]|1[0-2])h)?((([0-5]?[0-9])|60)m)?((([0-5]?[0-9])|60)s)?$/
    

    原始表达式有两个主要问题:1。这个 \d 最后,和2。捕获范围(注意表达式中的多余parens)。

    这也将捕获:1H13秒