【问题标题】:What is the regex for "A float with 2 decimal places, and only allows increments of 0.25"什么是“带有 2 位小数的浮点数,只允许 0.25 的增量”的正则表达式
【发布时间】:2023-03-22 02:55:02
【问题描述】:

我需要一个正则表达式来匹配以下输入:

 .25
 .50
 .75
 1.25. 1.50, 1.75 are allowed (increments of .25)
(2.0/2.00, 3.0/3.00, 4.0/4.00, 5.0/5.00 - not allowed)

允许的整数部分是 1-9 因此不允许使用 10.00 或 10.25...

不允许的特殊输入是:0、0.0 整数 1,2,3,4,5,6,7,8 和 9 是允许的,而 1.0/1.00, 2.0/2.00、3.0/3.00...等都是不允许的

此外,数字前允许使用否、正号或负号。

因此

0.25, 0.50, 0.75 应该是不允许的(当然.75之后只允许1)

到目前为止,我必须满足上述条件的正则表达式是:

   /^[-+]?[0-9](\.[2|5|7]{1}[5|0]{1})?$/;

在我的 javascript 中,我有:

  var catchfloat5 = /^[-+]?[0-9](\.[2|5|7]{1}[5|0]{1})?$/;
  var catchint2 = /^[1-9]$/; 

第二个正则表达式用于匹配整数 1-9。

在我做的代码中:

   if(inputHours.match(catchfloat5) || inputHours.match(catchint2) ) { 
    //alert("Correct, you entered float or an int");
    return true;

}

上面的代码似乎可以完成这项工作,但失败了,因为它允许以下输入:

0.25 0.50 0.75

它确实匹配 1.25、1.50、1.75 等等。

如何更正我的正则表达式以匹配:.25、.50 和 .75? 我认为我遇到的问题是:我确实有一个正则表达式也可能匹配负十进制数。当我试图摆脱正面和负面的符号时, 我打破了表达。

我确实很难理解 ?性格也。 我的研究来自: http://www.regular-expressions.info/quickstart.html


我想要完成的是: 与我上面描述的输入匹配的正则表达式 并在此过程中学习一些正则表达式的基础知识。

【问题讨论】:

  • ? 表示“0 或 1 次出现”。例如,[-+]? 表示匹配“-”或“+”一次或根本不匹配 - 基本上,符号是可选的
  • “数字前不允许有正号或负号”...那为什么你的正则表达式中有[-+]?
  • 我想我一开始天真地包含了[+-]。然后我试图摆脱它,但打破了表达
  • @user3825558 你是否也删除了它后面的??一个单独的? 会破坏表达
  • @adeneo 但是正则表达式是一切的答案!!11!1one! :p 不,你是对的,用简单的数学会更好。 val >= 1 && val < 10 && val % 0.25 == 0 会这样做。

标签: javascript regex


【解决方案1】:

为了清楚起见,您希望匹配 1 到 9.75(含)之间的 0.25 的任何倍数,其中整数不能有 .00,而半数必须有 .50

如果是这样,您的正则表达式是:

/^[1-9](?:\.25|\.50|\.75|)$/

为了解释,这允许 1 到 9 之间的任何数字作为整数部分,然后是 .25.50.75 之一或什么都没有。

如果这不是您所追求的,那么请澄清您的问题,因为需要几分钟和多次尝试才能理解这一点!

【讨论】:

  • 没错。我应该按照您的方式说明要求。你写的正是我想要的。为了进一步澄清,我还想只匹配整数 1、2、3、5、6、7、8 和 9。
  • 这个正则表达式仍然适用,注意空或选项。你也可以这样写 /^[1-9](?:\.25|\.50|\.75)?$/,虽然这只是我个人的偏好。我发现使用问号更容易阅读。
  • @wolffer-east 我在写作时犹豫不决,但决定在这里|) 会比)? 更好,因为“或无”似乎更明显替代选项。
  • @NiettheDarkAbsol 很公平,这不是我通常使用的语法,这就是为什么我觉得它更晦涩。再说一遍,这完全是个人喜好(除非对其中一个或另一个有性能优势,尽管我不知道)所以无论如何都行!
【解决方案2】:

试试下面的正则表达式:

/^(?:[1-9]|[1-9]?\.(?:25|50|75))$/

匹配

  • 除零以外的任何整数 1-9
  • 1-9 或空字符串后跟小数 .25、.50、.75,最多为任意数字;不允许使用前导零

如果你想匹配更多的数字和可选的前导符号,你可以这样做

/^[-+]?(?:[1-9][0-9]*|(?:[1-9][0-9]*)?\.(?:25|50|75))$/

【讨论】:

  • 我可能错了,但[-+] 并不意味着可选。 ? OP 已将其设为可选,对吧?
  • 是的,我想要匹配的输入和我不想匹配的输入似乎都适用于您的表达式。我现在正在测试。谢谢
【解决方案3】:

以下是您可以尝试的示例:

function match(n) {

    if (n.match(/^(|[1-9])\.(25|50|75)$/)) { return true; }
    return false;
}

console.log(match('1.25')); // true
console.log(match('0.25')); // false
console.log(match('.75')); // true
console.log(match('2.70')); // false
console.log(match('2.751')); // false
console.log(match('12.75')); // false
console.log(match('2.00')); // false

/* explanation
^           starts from
(|[1-9])    nothing or a Number between 1 & 9
\.          literal dot/point
(25|50|75)  either 25 or 50 or 75
$           end here
*/

这里是Fiddle

【讨论】:

  • 您将“字符串开头”^ 放在一个分支中,您的正则表达式也匹配 111111111111111111111111.25。
  • @user3825558 如果需要调整,请告诉我,我会为您解决 :)
猜你喜欢
  • 2022-07-22
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
相关资源
最近更新 更多