ここでは、正規表現があまり役に立たないと思います。彼らは本当に単純な照合をいくつか行うことができるかもしれませんが、ここで実際に見ているのは文法解析の問題です. Extended Backus-Naur Form (EBNF)など、抽象文法を表現するように設計された言語について読みたいと思うかもしれません。威圧的に聞こえるかもしれませんが、理解するのはそれほど難しいことではありません。文法を正式な言語で記述できるようになると、構文解析が非常に簡単になります (少なくとも、有効な入力の種類を指定できます)。たとえば、問題に対して次の EBNF があるとします。
expression = "every" time-unit|time-unit-list|composite-time-unit
time-unit = { ordinal } "day" | "weekday"
ordinal = "first" | "second" | "third" | ...
等々。これは簡単な仕事ではありません。英文の構文解析では、このようなかなり限定的なものでさえ、かなり関与する可能性があります。しかし、これは確立された厳密な方法です。
文法を定義したら、それ用のパーサーを作成できます。これは、ターミナル(「すべて」など)を探して、それらをルールに一致させることの問題です。たとえば、次のようなものがあるとします (疑似コード)。
words = split(/\s*/,lowercase(input))
if( words[0] == "every" ) {
switch( words[1] ) {
case "first":
case "second":
case "third":
...
parseTimeUnit(words);
break;
case "day":
everyDay = true;
break;
...
}
}
文法の複雑さによっては、Yaccなどを使用してパーサーを自動的に生成することを検討する場合があります。
あなたは問題の塊をかみ砕きましたが、やりがいのある問題です。頑張ってください!
更新: 私が知っている最も古いパーサー ジェネレーターの 1 つであるため、Yacc のみを提案しました。ただし、それらは 100 万個あり、その多くは Javascript を発行します。詳細については、ウィキペディアのパーサー ジェネレーターの比較を参照してください。