我正在研究一个字符串解析器,它将读取一个短语或句子并解析它以获取时间表/时间信息。例如,输入可能包括短语
“每天两次”
或者
“周一、周三和周五”
目标是创建一个模板,该模板可以转换为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) },
. . .
}
有什么更好的方法来做到这一点?