我正在研究一個字符串解析器,它將讀取一個短語或句子,並解析它的計劃/時間信息。例如,輸入可能包括短語C#解析關鍵短語與同義詞
「兩次,每天」
或
「在星期一,星期三和星期五」
的目標是創建一個模板,該模板在給定開始日期和結束日期時可以轉換爲DateTimes
的列表。我曾考慮將此模板存儲爲Func<DateTime, bool>
:
前面的示例可能可能被解釋爲(d => d.TimeOfDay == TimeSpan.FromHours(8) || d.TimeOFDay == TimeSpan.FromHours(18))
或任何次數最有意義。
後面的例子可以解釋爲(d => d.TimeOfDay == TimeSpan.FromHours(8) && (d.DayOfWeek == Monday || d.DayOfWeek == Wednesday || d.DayOfWeek == Friday))
。
然後,我可以在開始日期和結束日期之間循環每個小時,並在時間表中添加時間(如果函數返回true)。
我遇到的問題是解析。我目前的解決方案是創建一個包含我可能期望的所有短語的字典,並將適當的過濾器作爲值。然而,這開始看起來很凌亂和不可持續的,尤其是重疊的可能量:
var phrases = new Dictionary<string, Func<DateTime, bool>>()
{
{ "DAILY", (d => true) },
{ "A DAY", (d => true) },
{ "PER DAY", (d => true) },
{ "EVERY DAY", (d => true) },
{ "SUNDAY", (d => d.DayOfWeek == DayOfWeek.Sunday) },
{ "SUN", (d => d.DayOfWeek == DayOfWeek.Sunday) },
{ "MONDAY", (d => d.DayOfWeek == DayOfWeek.Monday) },
{ "MON", (d => d.DayOfWeek == DayOfWeek.Monday) },
. . .
}
什麼是更好的方式來做到這一點?
可能想看看自然語言處理。 –
它可能有助於編寫/實現DFA(確定性有限自動機)。你從「開始狀態」開始,然後遍歷句子中的每個單詞,並根據單詞如何影響句子的「種類」,轉換到新狀態(或回到當前狀態)。你將不得不提出這些轉換的規則。 –
看看這個:http://www.codeproject.com/Articles/38553/TaskScheduler –