首页 文章

正则表达式:限制整个匹配AND字符类

提问于
浏览
2

是否可以使用正则表达式来允许匹配具有最大字符数,在不同的字符类之间划分?

我需要匹配最多4位数的数字,有或没有十进制数字 . 所以这些都应该与正则表达式匹配:

123
1234
12.34
123.4

但这些不应该:

12345
12.345

在概念上,这样的东西应该有效,除非它没有:

([0-9]{0,4}([.]?[0-9]{0,4})){0,4}

4 回答

  • 1

    使用前瞻来断言最多有1个点:

    ^(?!([^.]\.){2})(?!\d{5})[\d.]{3,5}$
    
    • (?!([^.]\.){2}) 意思是“向前看,没有2个点

    • (?!\d{5}) 表示"looking ahead, there aren't 5 straight digits"

    • [\d.]{3,5} 表示"3-5 of digits and dots"

    live demo .


    要将十进制数字限制为最大值2,请添加 (?!.*\.\\d{3,}$) ,这是"dot then 3+ digits at the end"的负面预测,即:

    ^(?!([^.]\.){2})(?!\d{5})(?!.*\.\\d{3,}$)[\d.]{3,5}$
    

    live demo .

  • 1

    它不漂亮,但你可以这样做:

    (\d{1,4}|\d{0,3}\.\d|\d{0,2}\.\d{0,2}|\d\.\d{0,3})
    

    只要确保你周围有一些边界控制字符 .

    这样说:

    (?:^|[^\d.])(\d{1,4}|\d{0,3}\.\d|\d{0,2}\.\d{0,2}|\d\.\d{0,3})(?:$|[^\d.])
    

    您可以see here它按预期工作 .

    但是,我会建议在这个具体案例中使用另一种工具 .

  • 1

    以下正则表达式应该这样做......

    \b(?:\d{1,3}\.\d{1,2}|\d{1}\.\d{1,3}|(?<!\.)\d{1,4}(?!\.))\b
    

    regex demo / explanation

  • 1

    如果你的正则表达式接受它,你可以使用如下前瞻:

    编辑:允许最多2位小数

    ^(?:\d{1,4}|(?=.{1,5}$)\d+\.\d{1,2})$
    

    Explanation:

    ^               : begining of string
      (?:           : start non capture group
        \d{1,4}     : 1 up to 4 digit
        |           : OR
        (?=         : lookahead
          .{1,5}$   : 1 up to 5 character (it could be .{3,5} if at least 1 digit is mandatory on each side of the dot)
        )           : end lookahead
        \d+         : 1 or more digits, integer part
        \.          : dot
        \d{1,2}     : 1 or 2 digits, decimal part
      )             : end group
    $               : end of string
    
    var test = [
    123,
    1234,
    12.34,
    123.4,
    12345,
    12.345,
    1.234
    ];
    console.log(test.map(function (a) {
      return a+' :'+/^(?:\d{1,4}|(?=.{1,5}$)\d+\.\d{1,2})$/.test(a);
    }));
    

相关问题