【问题标题】:In regular expression or operator between 2 group is not working在 2 组之间的正则表达式或运算符不起作用
【发布时间】:2018-04-17 14:45:36
【问题描述】:

我正在尝试创建范围 0 到 8759.59

的 JavaScript 正则表达式

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

正则表达式1

^([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 到 8758.99 的表达式不接受 8760, 下面是这个表达式:

正则表达式2

^([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 范围内的值

【问题讨论】:

  • 您真的在使用日期/时间字符串吗?
  • 您有什么理由只尝试使用 RegExp?通过解析字符串并进行数字检查可能会更好地服务...
  • 你为什么不使用等比较运算符?
  • 请提供样本输入、所需输出和当前输出。显示一些上下文代码以帮助理解稍微古怪的要求。
  • 尝试证明是什么让您认为 OR 运算符不起作用。

标签: javascript regex


【解决方案1】:

根据 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 位数字

【讨论】:

  • 这不是我所需要的,因为你的表达也不接受 10.60。但我需要表达式,除了每个值小于或等于 8759.59
  • !!!!你在你的问题中写道:我已经为 0 到 8759.59 创建了 2 个正则表达式,除了十进制到 0.59 之外,只有 10.59 是可以接受的,但 10.60 是不可接受的。这很奇怪!
  • @RizwanM.Tuman 根据我的理解,她想要一个接受 0 到 8759.59 之间值的正则表达式
  • @UmangPatwa 你为什么要猜测 OP 在哪里清楚地写着 10.60 是不可接受的?它应该被编辑不是吗?
  • @RizwanM.Tuman 我测试了 OP 提供的表达式。并且她希望或运算符介于 Regex2Regex1 之间,这意味着她希望它应该接受 10.6010 任何小于的值然后是 8759 但如果值是 8759 那么它不应该接受更多,那么像 8759.99 这样的 .59 是不可接受的,但是 8759.59 可以接受
【解决方案2】:

你可以试试这个,

^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]))

【讨论】:

  • 8[0-7][0-5][0-8] 表示8169无效
【解决方案3】:

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

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))

【讨论】:

  • 您的答案接受无效的数字格式将\d* 转换为\d+ 然后它将起作用
  • console.log(validateNumber('8759.59999999999999999999999999999999999999999', 0, 8759.59))都不起作用
  • 请解释您认为\d* 不正确的原因。
  • '\.\d* ' 表示66. 是一个有效数字.. 它不是...假设当用户按键时将使用此验证器...并且输入值将直接作为字符串存储在数据库中......作为一个展示单元,这是一个错误
  • 只要我们用英文讨论,66. 就是一个完全有效的数字表示。 .66 也是一个完全有效的英文数字,​​我的回答(故意)没有处理它。
猜你喜欢
  • 2015-06-22
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
  • 2012-10-30
  • 1970-01-01
  • 2014-01-01
  • 2021-06-04
相关资源
最近更新 更多