正则表达式javascript数字和字母

正则表达式javascript数字和字母,javascript,regex,formatting,Javascript,Regex,Formatting,我一辈子都搞不懂如何用格式设置元素的正则表达式 1d 5h 6m 12s 并且允许它有任何变化,比如 1d 1d 1h 1d 1h 1m 1d 1s 6m 12s etc... 正则表达式可以进行这种格式设置吗?假设需要按顺序设置 if (/^\s*(?:(?:[1-9]\d*|0)d\s+)?(?:(?:1?\d|2[0-3])h\s+)?(?:[1-5]?\dm\s+)?(?:[1-5]?\ds)?\s*$/.test(str)) { // success }

我一辈子都搞不懂如何用格式设置元素的正则表达式

1d 5h 6m 12s
并且允许它有任何变化,比如

1d 

1d 1h

1d 1h 1m 

1d 1s

6m 12s 

etc...

正则表达式可以进行这种格式设置吗?

假设需要按顺序设置

if (/^\s*(?:(?:[1-9]\d*|0)d\s+)?(?:(?:1?\d|2[0-3])h\s+)?(?:[1-5]?\dm\s+)?(?:[1-5]?\ds)?\s*$/.test(str))
{
    // success
}
下面是一个快速细分:

  • ^
    $
    称为锚定。它们匹配字符串的开头和结尾,因此您匹配的是整个字符串,而不仅仅是一部分,例如,
    hello,world!否则1d 5h 6m 12s将通过

  • \s*
    \s+
    匹配零个或多个空格字符,以及一个或多个空格字符

  • (?:[1-9]\d*| 0)
    匹配任意数量的数字,但不匹配以零开头的数字,除非它正好是零

  • (?:1?\d|2[0-3])
    匹配0和23之间的数字(包括0和23)

  • [1-5]?\d
    匹配0和59之间的数字(包括0和59)

  • (?:…)
    称为非捕获组。它们类似于括号(用于分组),除了普通的ol'括号捕获,我们这里不需要它

  • 表示前面的实体是可选的


  • 假设你需要它来维持秩序

    if (/^\s*(?:(?:[1-9]\d*|0)d\s+)?(?:(?:1?\d|2[0-3])h\s+)?(?:[1-5]?\dm\s+)?(?:[1-5]?\ds)?\s*$/.test(str))
    {
        // success
    }
    
    下面是一个快速细分:

  • ^
    $
    称为锚定。它们匹配字符串的开头和结尾,因此您匹配的是整个字符串,而不仅仅是一部分,例如,
    hello,world!否则1d 5h 6m 12s将通过

  • \s*
    \s+
    匹配零个或多个空格字符,以及一个或多个空格字符

  • (?:[1-9]\d*| 0)
    匹配任意数量的数字,但不匹配以零开头的数字,除非它正好是零

  • (?:1?\d|2[0-3])
    匹配0和23之间的数字(包括0和23)

  • [1-5]?\d
    匹配0和59之间的数字(包括0和59)

  • (?:…)
    称为非捕获组。它们类似于括号(用于分组),除了普通的ol'括号捕获,我们这里不需要它

  • 表示前面的实体是可选的


  • 给你一个起点:

    (\d+d){0,1} //days - not checking for a max
    
    (((([0-1]){0,1}\d)|(2[0-4]))h){0,1} // 24 hours
    
    (((([0-5]){0,1}[0-9])|(60))m){0,1} //60 minutes
    
    (((([0-5]){0,1}[0-9])|(60))s){0,1} //60 seconds
    
    然后将它们放在一起(在本例中,不必担心空格的数量)

    包括@nhahdh在评论中对上述内容的改进版本。谢谢

    ((\d+)d)? *(([01]?\d|2[0-4])h)? *(([0-5]?\d|60)m)? *(([0-5]?\d|60)s)? *
    

    给你一个起点:

    (\d+d){0,1} //days - not checking for a max
    
    (((([0-1]){0,1}\d)|(2[0-4]))h){0,1} // 24 hours
    
    (((([0-5]){0,1}[0-9])|(60))m){0,1} //60 minutes
    
    (((([0-5]){0,1}[0-9])|(60))s){0,1} //60 seconds
    
    然后将它们放在一起(在本例中,不必担心空格的数量)

    包括@nhahdh在评论中对上述内容的改进版本。谢谢

    ((\d+)d)? *(([01]?\d|2[0-4])h)? *(([0-5]?\d|60)m)? *(([0-5]?\d|60)s)? *
    

    我想这就是你想要的:

    function parse(s) {
     y = s.match(/(?:(\d+)d\s*)?(?:(\d+)h\s*)?(?:(\d+)m\s*)?(?:(\d+)s)?/);
     console.log(y);
     return y;
    }
    
    下面是它的工作原理:

    • (\d+)d\s*
      匹配一些数字,后跟一个
      d
      ,后跟可选的空白
    • 将其包装在
      (?:…)?
      中,就像
      (?:(\d+)d\s*)?
      一样,可以选择上述选项。
      ?:
      导致新的括号集不是捕获组
    • 重复h、m和s,你就完成了

      • 我想这就是你想要的:

        function parse(s) {
         y = s.match(/(?:(\d+)d\s*)?(?:(\d+)h\s*)?(?:(\d+)m\s*)?(?:(\d+)s)?/);
         console.log(y);
         return y;
        }
        
        下面是它的工作原理:

        • (\d+)d\s*
          匹配一些数字,后跟一个
          d
          ,后跟可选的空白
        • 将其包装在
          (?:…)?
          中,就像
          (?:(\d+)d\s*)?
          一样,可以选择上述选项。
          ?:
          导致新的括号集不是捕获组
        • 重复h、m和s,你就完成了

        你到底想完成什么?正则表达式与格式没有多大关系。您是否正在尝试为有效的时间跨度分析该类型的值?或者试图把它转换成什么?目标是什么。回答的起点:“^(\d+d)?(\d+h)?(\d+m)?(\d+s)?”。让我们知道为什么这还不够好。也许正则表达式不是最好的选择,但我需要的是,当用户在输入字段中键入内容,我在该字段上运行验证时,我需要该字段只包含日期、小时、,分和秒的格式是数字,然后是字母5m 1s,也就是5分1秒。在决定是否使用正则表达式之前,您需要设置一些定义良好的通过和失败标准。你想匹配哪种类型的模式,更重要的是,你不想匹配哪种类型的模式?你到底想实现什么?正则表达式与格式没有多大关系。您是否正在尝试为有效的时间跨度分析该类型的值?或者试图把它转换成什么?目标是什么。回答的起点:“^(\d+d)?(\d+h)?(\d+m)?(\d+s)?”。让我们知道为什么这还不够好。也许正则表达式不是最好的选择,但我需要的是,当用户在输入字段中键入内容,我在该字段上运行验证时,我需要该字段只包含日期、小时、,分和秒的格式是数字,然后是字母5m 1s,也就是5分1秒。在决定是否使用正则表达式之前,您需要设置一些定义良好的通过和失败标准。您希望匹配哪种类型的模式,以及几乎更重要的是,您不希望匹配哪种类型的模式?请注意,这将在换行符和制表符上匹配。如果您只想要布尔结果,请使用
        test()
        not
        match()
        ,但这在“1d 1h”等示例输入上失败。问题在于组外的
        \s+
        。请注意,这将在换行符和制表符上匹配。如果只需要布尔结果,则使用
        test()
        not
        match()
        ,但在“1d 1h”等示例输入上失败。问题是组外的
        \s+
        。我发现其中一个是多余的(已修复)。我认为其余的都是必需的