在正则表达式或2组之间的运算符不起作用

时间:2018-04-17 04:54:25

标签: javascript regex

我正在尝试创建范围 0到875​​9.59 的JavaScript正则表达式

我创建了2个正则表达式: 以下是我的表达方式:

  

regex1的

^([0-9]|[1-8][0-9]|9[0-9]|[1-8][0-9]{2}|9[0-8][0-9]|99[0-9]|[1-7][0-9]{3}|8[0-6][0-9]{2}|87[0-5][0-9]|8759)(\.([0-9]|[1-4][0-9]|5[0-9]))?$

另一个范围0到875​​8.99的表达式不接受8760, 以下是此表达式:

  

Regex2

^([0-9]|[1-8][0-9]|9[0-9]|[1-8][0-9]{2}|9[0-8][0-9]|99[0-9]|[1-7][0-9]{3}|8[0-6][0-9]{2}|87[0-5][0-9]|8758)(\.\d{1,2})?$

现在,当我尝试在Regex2和Regex1之间放置或运算时,它就没有按预期运行。

我希望它应该接受0-8759.59范围内的值

3 个答案:

答案 0 :(得分:2)

  

根据OP的评论更新:(This will match anything less than 8759.60

^8759(\.[0-5]\d?)?$|^(87[0-5][0-8]|8[0-6]\d{2}|[0-7]\d{3}|\d{1,3})(\.\d\d?)?$

更新了代码段

    const regex = /^(87[0-5]\d|8[0-6]\d{2}|[0-7]\d{3}|\d{1,3})(\.[0-5]\d?)?$/;
    console.log(regex.test(`0`));
    console.log(regex.test(`8759.59`));
    console.log(regex.test(`8759.60`));
    console.log(regex.test(`10.59`));
    console.log(regex.test(`10.60`));
    console.log(regex.test(`8759`));
    console.log(regex.test(`876`));
    console.log(regex.test(`8761`));
    console.log(regex.test(`123.1`));

说明:

  • ^字符串开头
  • (87[0-5]\d|8[0-6]\d{2}|[0-7]\d{3}|\d{1,3}) 4个替代方案 -
  • 87[0-5]\d 87后跟0-5之间的任何数字,然后是任何数字         OR

    8[0-6]\d{2} 8后跟0-6和任意两位数之间的任何内容 OR

    [0-7]\d{3} 0-7后跟任意3位

    OR

  • \d{1,3}任意1至3位

答案 1 :(得分:1)

你可以试试这个,

^8759(?:\.[0-5]\d?)?$|^(?:(?:(?:|[1-9]|[1-9]\d|[1-7]\d{2})\d|8[0-7][0-5][0-8])(?:\.\d{1,2})?)$

Demo

已修改,因为上面的正则表达式错过了8[0-7][0-5][0-8]不接受合法输入的点,8199,8369等

^8759(?:\.[0-5]\d?)?$|^(?:(?:(?:|[1-9]|[1-9]\d|[1-7]\d{2})\d|8(?:[0-6]\d{2}|7(?:[0-4]\d|5[0-8])))(?:\.\d{1,2})?)$

Demo

8[0-7][0-5][0-8]

更改了部分
8(?:[0-6]\d{2}|7(?:[0-4]\d|5[0-8]))

答案 2 :(得分:0)

正则表达式不是用于验证数字是否属于某个范围的工具 是检查字符串是否是数字的文本表示的好工具,所以让我们将它们用于此目的,让比较运算符处理范围检查:

function validateNumber(input, min, max)
{
    const re = /^\d+(\.\d*)?$/

    if (re.exec(input)) {
       let nb = parseFloat(input)
       return min <= nb && nb <= max
    } else {
       return false
    }
}

console.log(validateNumber('8759.60', 0, 8759.59))