私の理解が正しければ、繰り返しのない代替グループが必要です。これは少し複雑で、いくつかの制限がありますが、実行できます。
必要がある
- 回答の前後にランダムなフィラー ワード、句読点などを許可します。基本的に、答えにならないものは何でも
(?:(?!(?:\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 フラグは、tubular のデフォルトです)、
PCRE デモ( gmxi-flagsを
使用)
これは基本的な考え方を示しており、開始する必要があります。とはいえ、正規表現は言語ツールでも AI でもありません。パターンは文脈に依存せず、回答が実際に意味をなすかどうかを検証しません。たとえば、rain|sunlight|bark可能な回答として定義すると、これは有効です。
ゾウの鳴き声、緑の日光、紫の雨、その他ナンセンス