在画布测验中使用单个正则表达式的无重复替代组

问题描述

我在一所中学与Canvas合作,正在构建测验,其中包含一个称为“空白填空”的问题类型。此类问题的评分选项是将学生输入的内容与正则表达式进行比较。测验设置仅允许我输入一个正则表达式,如果输入匹配,则该问题被视为正确。对于单个或几个单词的答案,这很容易做到。但是我想问一下类似的问题,“列举三个不同的环境刺激实例,以句号结尾”。因此,正确的输入字符串可能如下所示:

雨。灿烂的阳光。狗的皮。

但是错误的输入字符串将是:

水。水。自行车。

我可以匹配单个短语并使用([\w\s']*[^\.]?)对其进行拆分。这在正则表达式测试器中产生了三个匹配项。但是我需要走的更远。

我需要检查每个短语的关键字,然后检查该关键字是否曾经被使用过。本质上,我需要使用单个正则表达式模式来匹配一个交替组而无需重复。能做到吗?

解决方法

如果我理解正确,那么您希望有一个无重复的轮换组。这有点复杂并且有一些限制,但是可以做到。

我们需要

  • 允许在答案前后随机填充单词,标点符号等;基本上,任何不是答案的(?:(?!(?:\1|\2|\3)).)*
  • 并以不允许重复的方式在轮换组中定义答案(根据需要使用\b字边界)

即使用正则表达式标志gxi(或内联(其中的)(?x)(?i)

)的这种模式
^                                    # begin of string
(?:(?!(?:\1|\2|\3)).)*?              # ungreedy anything that is not captured by group 1,2,or 3
   (                                 # 1th capturing group
    (?:\brain\b|\bsunlight\b|\bbark) # Alternation group (answers) \b word-boundaries as needed
   )
(?:(?!(?:\1|\2|\3)).)*?              # ungreedy anything that is not captured by group 1,or 3
   (                                 # 3th capturing group
    (?:(?!(?:\1|\3))(?:\brain\b|\bsunlight\b|\bbark)) # Answers not captured in group 1 or 3
   )
(?:(?!(?:\1|\2|\3)).)*?              # ungreedy anything that is not captured by group 1,or 3
   (                                 # 4th capturing group
    (?:(?!(?:\2|\3))(?:\brain\b|\bsunlight\b|\bbark)) # Answers not captured by group 2 or 3
   )
(?:(?!(?:\1|\2|\3)).)*               # anything that is not captured by group 1,or 3
$                                    # end of string

可以简化模式,但我尝试使模式保持可读性(不过,(?(DEFINE).(?"answers"))之类的技术可以帮助我们使正则表达式更易于维护。)

Ruby Rublar Demog |全局,而m |多行标志是管状的默认设置),
PCRE Demo(使用gmxi标志)
测验正在使用Ruby正则表达式,该表达式与PCRE非常相似,但不完全相同。

这显示了基本思路,应该可以帮助您入门。但是,正则表达式既不是语言学工具也不是AI。该模式是无上下文的,并且不会验证答案是否具有实际意义,例如如果我们将rain|sunlight|bark定义为可能的答案,则这是有效的:

吠叫的大象,绿色的阳光,紫色的雨水和其他废话

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...