在 Canvas 测验中使用单个正则表达式进行无重复的交替组
Alternation group without repetitions using a single regex in a Canvas Quiz
我在一所中学与 Canvas 一起工作,并且正在构建包含称为“填空”的问题类型的测验。此类问题的评分选项是将学生输入的内容与正则表达式进行比较。测验设置只允许我输入一个正则表达式,如果输入匹配问题被视为正确。对于单个或几个单词的答案,这很容易做到。但我想问类似的问题,“列出三个不同的环境刺激示例,以句号结尾”。因此,正确的输入字符串可能如下所示:
下雨了。明亮的阳光。狗叫声。
但不正确的输入字符串将是:
水。水。一辆自行车。
我可以匹配单个短语并使用 ([\w\s']*[^\.]?)
拆分它们。这会在正则表达式测试器中产生三个匹配项。但我需要更进一步。
我需要检查每个词组的关键字,然后检查以前是否使用过该关键字。本质上,我需要使用单个正则表达式模式匹配交替组而不重复。这能做到吗?
如果我没理解错的话,你想要一个没有重复的交替组。这有点复杂,有一些限制,但可以做到。
我们需要
- 答案前后允许随机填充词、标点符号等;基本上,任何不是答案的东西
(?:(?!(?:||)).)*
- 并以不允许重复的方式在交替组中定义答案(根据需要使用
\b
个词边界)
即使用正则表达式标志 gxi(或内联(其中一些)它们 (?x)(?i)
的模式
^ # begin of string
(?:(?!(?:||)).)*? # 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
)
(?:(?!(?:||)).)*? # ungreedy anything that is not captured by group 1,2,or 3
( # 3th capturing group
(?:(?!(?:|))(?:\brain\b|\bsunlight\b|\bbark)) # Answers not captured in group 1 or 3
)
(?:(?!(?:||)).)*? # ungreedy anything that is not captured by group 1,2,or 3
( # 4th capturing group
(?:(?!(?:|))(?:\brain\b|\bsunlight\b|\bbark)) # Answers not captured by group 2 or 3
)
(?:(?!(?:||)).)* # anything that is not captured by group 1,2,or 3
$ # end of string
模式可以简化,但我试图保持模式的可读性(尽管 (?(DEFINE).(?"answers"))
等技术可以帮助我们使正则表达式更易于维护。)
Ruby Rublar Demo(g
|全局,m
|管状默认多行标志),
PCRE Demo(使用 gmxi
-标志)
测验使用 Ruby 与 PCRE 非常相似但不完全相同的正则表达式。
这展示了基本思想,应该可以帮助您入门。尽管如此,正则表达式不是语言学工具,也不是人工智能。模式是 context-free 并且不验证答案是否有实际意义,例如如果我们将 rain|sunlight|bark
定义为可能的答案,这是有效的:
Barking elephant, green Sunlight, purple rain, and other non-sense
我在一所中学与 Canvas 一起工作,并且正在构建包含称为“填空”的问题类型的测验。此类问题的评分选项是将学生输入的内容与正则表达式进行比较。测验设置只允许我输入一个正则表达式,如果输入匹配问题被视为正确。对于单个或几个单词的答案,这很容易做到。但我想问类似的问题,“列出三个不同的环境刺激示例,以句号结尾”。因此,正确的输入字符串可能如下所示:
下雨了。明亮的阳光。狗叫声。
但不正确的输入字符串将是:
水。水。一辆自行车。
我可以匹配单个短语并使用 ([\w\s']*[^\.]?)
拆分它们。这会在正则表达式测试器中产生三个匹配项。但我需要更进一步。
我需要检查每个词组的关键字,然后检查以前是否使用过该关键字。本质上,我需要使用单个正则表达式模式匹配交替组而不重复。这能做到吗?
如果我没理解错的话,你想要一个没有重复的交替组。这有点复杂,有一些限制,但可以做到。
我们需要
- 答案前后允许随机填充词、标点符号等;基本上,任何不是答案的东西
(?:(?!(?:||)).)*
- 并以不允许重复的方式在交替组中定义答案(根据需要使用
\b
个词边界)
即使用正则表达式标志 gxi(或内联(其中一些)它们 (?x)(?i)
^ # begin of string
(?:(?!(?:||)).)*? # 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
)
(?:(?!(?:||)).)*? # ungreedy anything that is not captured by group 1,2,or 3
( # 3th capturing group
(?:(?!(?:|))(?:\brain\b|\bsunlight\b|\bbark)) # Answers not captured in group 1 or 3
)
(?:(?!(?:||)).)*? # ungreedy anything that is not captured by group 1,2,or 3
( # 4th capturing group
(?:(?!(?:|))(?:\brain\b|\bsunlight\b|\bbark)) # Answers not captured by group 2 or 3
)
(?:(?!(?:||)).)* # anything that is not captured by group 1,2,or 3
$ # end of string
模式可以简化,但我试图保持模式的可读性(尽管 (?(DEFINE).(?"answers"))
等技术可以帮助我们使正则表达式更易于维护。)
Ruby Rublar Demo(g
|全局,m
|管状默认多行标志),
PCRE Demo(使用 gmxi
-标志)
测验使用 Ruby 与 PCRE 非常相似但不完全相同的正则表达式。
这展示了基本思想,应该可以帮助您入门。尽管如此,正则表达式不是语言学工具,也不是人工智能。模式是 context-free 并且不验证答案是否有实际意义,例如如果我们将 rain|sunlight|bark
定义为可能的答案,这是有效的:
Barking elephant, green Sunlight, purple rain, and other non-sense