-2

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

雨。明亮的阳光。狗的吠声。

但不正确的输入字符串将是:

水。水。一辆自行车。

我可以匹配单个短语并使用([\w\s']*[^\.]?). 这会在正则表达式测试器中产生三个匹配项。但我需要更进一步。

我需要检查每个短语的关键字,然后检查该关键字之前是否使用过。本质上,我需要使用单个正则表达式模式匹配一​​个不重复的交替组。这可以做到吗?

4

1 回答 1

0

如果我理解正确,您希望有一个不重复的交替组。这有点复杂,有一些限制,但可以做到。

我们要

  • 允许在答案前后随机填充词、标点符号等;基本上,任何不是答案的东西(?:(?!(?:\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,2,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,2,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,2,or 3
$                                    # end of string

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

Ruby Rublar 演示g|global 和m|multiline 标志是默认的),
PCRE 演示(使用gmxi-flags)
测验使用与 PCRE 非常相似但不完全相同的 Ruby 正则表达式。

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

大象吠叫,绿色阳光,紫色雨,和其他的胡说八道

于 2020-10-27T21:12:33.890 回答