如果我理解正确,您希望有一个不重复的交替组。这有点复杂,有一些限制,但可以做到。
我们要
- 允许在答案前后随机填充词、标点符号等;基本上,任何不是答案的东西
(?:(?!(?:\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
为可能的答案,则这是有效的:
大象吠叫,绿色阳光,紫色雨,和其他的胡说八道