【问题标题】:regular expression for matching a specific decimal number用于匹配特定十进制数的正则表达式
【发布时间】:2011-01-29 15:52:55
【问题描述】:

我需要验证用户输入的答案对于在线测验是否正确。

答案应该是一个十进制数,可以通过多种不同的方式输入。例如,

0.666666... 

可以匹配

.66
.67
.66666
.667
0.6667 

等等

基本上,我想忽略舍入、精度和前面的零。我找到的示例用于匹配任何十进制数字。

谢谢,

RT

编辑 -

我正在为 WebCT 编写一个测验。它允许匹配正确答案的三个选项:“等于”、“包含”和“正则表达式”。我相信 WebCT 是基于 Java 的。但我不能确定它使用什么风格的正则表达式。我可以要求用户提供最多三位小数的正确答案。在这种情况下,正确答案可能是以下四种之一: 0.666 0.667 .666 .667

【问题讨论】:

  • 为什么是正则表达式?为什么?而是告诉我们您使用的是什么语言,我们会给您合理的答案。
  • 什么语言?为什么需要正则表达式?这不是正则表达式的完美选择。
  • 您需要更具体。正则表达式是纯文本的,没有“可以以多种不同方式表示的十进制数”的概念
  • RE 匹配对数字一无所知,它只是匹配文本。为什么不能将字符串匹配为有效的数字字符串,将其转换为浮点数,然后使用所需值周围的增量范围进行算术比较?

标签: regex


【解决方案1】:

对于分数的十进制表示,您有一个很好的范式:它将由一个有限小数组成,后跟一系列无限重复的十进制数字。因此,例如,1/7 是“0”。随后是无限多次重复“142857”。在某种意义上(见下文),这些小数表示是唯一可以用正则表达式表示的表示。

这些技术是用树来表示它们,其中基本部分是一系列可选的括号表达式,还有表示向上舍入的替代方法,因此 8.19 将给出8(.(2|(19?)?)?,然后重复部分加星号,并且然后是一个部分,给出了重复部分可能被四舍五入的所有方式。

例如:1/7 由0?.(142857)*(1(4(3|2(8(6|57?)?)?)?)?)? 给出。

一边

正则表达式只能表示分数的含义如下。假设一个形式表达式描述了一个十进制表示,如果它的语言是数字的所有有限十进制前缀,那么 2/3 的表达式必须有它的语言 0、0.6、0.66、0.666 等。以这种方式只接受前缀的有限状态机必须重复自身,因此是分数。

所以没有正则表达式接受,确切地说是sqrt(2)

【讨论】:

  • 嗨,查尔斯,您的回答帮助解决了一个比我最初发布的问题更普遍的问题。谢谢,RT
  • @user151410:我的回答没有解释如何处理进位(基本上,只要 9 后跟 5-9),所以有一个棘手的情况,例如 1.00000 和 0.9999 是相同数字的近似值,它有两个不同的循环小数,1+0/9 或 0+9/9。如果有兴趣,我可能会在稍后添加。
【解决方案2】:

您最好将用户输入的字符串简单地转换为数字(使用您拥有的任何语言工具,例如 C 的 atof),然后确保它足够接近(在设定的误差范围内),甚至通过指定最小值和最大值(比如 0.6 和 0.67)。

但是,如果你真的想要一个正则表达式:

^0*\.6+7?$

应该为那个特定的数字做伎俩。

这是0 中的零个,后跟.,然后是一个或多个6 字符和一个可选的7

要按照评论中的要求强制保留至少两位小数,您可以使用:

^0*\.6+[67]$

这会强制它以 67 结尾,并且在其前面有一个或多个 6 字符。

【讨论】:

  • 虽然这是一种相当合理的方法,但我并不完全确定我是否同意。如果问题是“三分之二十进制表示的前几位是什么?”有人写“0.66666091”我实际上不确定是否应该标记为正确,尽管它非常接近。您的方法会接受这一点,但他们显然不了解重复小数的基本原则。
  • 超级。有用!!答案不必精确。有没有办法强制“至少”两位小数:正确 - .66,.67。不正确 0.6。非常感谢,rt
  • 有什么办法可以避免使用方括号?? webCT 要求答案用方括号 [] 括起来,并抱怨嵌套括号 [^0*\.6+[67]$]。谢谢
  • 是的,您可以使用^0*\.66+7?$,它给您带来几乎相同的效果,但这种限制似乎有点武断。
【解决方案3】:

/^0*\.6+7?\.*$/

分解:

^0*

\.

6+

7?

\.*$

【讨论】:

  • 嗨,马特,感谢您的解释。在您自己的问题的背景下学习一些东西会更容易。 rt
【解决方案4】:

听起来你不需要正则表达式。它们是纯文本的,没有“可以用多种方式表示的十进制数”的概念。

我认为您应该做的是将用户的答案转换为您正在使用的任何编程语言中的浮点数据类型,然后从正确答案中减去它。结果是学生的答案有错误。如果结果小于某个阈值,例如 +0.06,则认为它是正确的。这样,0.6、0.66、0.667、0.6667 等都将被认为是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 2013-11-26
    相关资源
    最近更新 更多