我需要验证用户输入的答案是否适用于在线测验。
答案应该是十进制数,可以通过多种不同的方式输入。例如,
0.666666...
可以匹配
.66
.67
.66666
.667
0.6667
等
基本上,我想忽略舍入,精度和前置零。我找到的例子是匹配任何十进制数。
感谢,
RT
编辑 -
我正在为WebCT写一个测验。它允许三个选项匹配正确答案:“等于”,“包含”和“正则表达式”。我相信WebCT是基于Java的。但我无法确定它使用的正则表达式的风格。我可以要求用户提供最多三位小数的正确答案。在这种情况下,正确答案可以是以下四种之一: 0.666 0.667 0.666 0.667
答案 0 :(得分:2)
对于分数的十进制表示,您有一个很好的法线形式:它将包含一个有限小数,后跟一个无限重复的十进制数字序列。因此,例如,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和& c。以这种方式只接受前缀的有限状态机必须重复,因此是一个分数。
所以没有正则表达式接受,恰好说sqrt(2)
。
答案 1 :(得分:1)
/^0*\.6+7?\.*$/
细分:
^0*
< - 可选零
\.
< - 转义小数
6+
< - 至少一个6或更多
7?
< - 可选7
\.*$
< - 省略号,至少0或更多
答案 2 :(得分:1)
您可能最好只是将用户输入的字符串转换为数字(使用您拥有的任何语言设施,使用C atof
),然后确保它足够接近(在设定的误差范围内),或者甚至通过指定最小值和最大值(比如0.6和0.67)。
但是,如果你真的想要一个正则表达式:
^0*\.6+7?$
应该为特定号码做点滴滴。
0
后面跟着.
,然后是一个或多个6
个字符和一个可选的7
,其余为零。
要在评论中强制执行至少两位小数,您可以使用:
^0*\.6+[67]$
这会强制它以6
或7
结尾,并且在此之前有一个或多个6
个字符。
答案 3 :(得分:0)
这听起来不像你想要正则表达式。它们纯粹是文本性的,没有“可以用多种方式表达的十进制数”的概念。
我认为您应该做的是将用户的答案转换为您正在使用的任何编程语言的浮点数据类型,并从正确的答案中减去它。结果是学生答案中的错误。如果结果小于某个阈值,比如+0.06,那么认为它是正确的。这样,0.6,0.66,0.667,0.6667等都被认为是正确的。