2

次のような期間を含む文字列を解析する必要があります。

  • 木曜日の午前 6:30 ~ 7:30
  • 2009 年 12 月 30 日~2010 年 1 月 1 日
  • 2009 年 1 月 15 日、午後 7 時 30 分から 8 時 30 分
  • 木曜日、午前 6 時 30 分から午前 7 時 30 分まで
  • その他...

追加した

  • 6:30~7:30

Wordのinsert->dateが生成できるほとんどのケースなどの日付/時刻

私がカバーする必要があるすべてのケースをカバーするものがあるとしたら、非常に驚​​くので、最初に文法を探しています。

4

1 に答える 1

7

わかりました。次の文法は、例のすべてを解析します。

DTExp        = Day, ['-', Day]
Day          = DayExp, [[','], ['from'], TimeRange]
DayExp       = WeekDay
             | [Weekday], Month, DayNumber, [[','], YearNumber]
             | [Weekday], MonthNumber, '/', DayNumber, ['/', YearNumber]
TimeRange    = Time, [['-'|'to'] Time]
Time         = HourNumber, ':', MinuteNumber, ['AM'|'PM']
WeekDay      = 'monday' | 'tuesday' | ...
Month        = MonthNumber | MonthName
MonthName    = 'january' | 'february' | ...
DayNumber    = Number
MonthNumber  = Number
YearNumber   = Number, ['AD'|'BC']
HourNumber   = Number
MinuteNumber = Number

文法に少し問題があります。DayExpが読み取られ、その後にTimeが続き、「-」が続く場合は、別のDayExpまたは別の時間を期待できます。しかし、これは先読みによって解決されます。時間の場合、数字の後に「:」が続くためです。

解析ツリーを構築してみましょう。

Thursday  6    :  30     -   7    :   30    AM
    |     |        |         |         |     |
WeekDay Number : Number  - Number : Number   |
    |     -----|----         -----|----------- 
    |         Time       -       Time
    |           ---------|---------
 DayExp              TimeRange
    ----------|-----------
             Day
              |
            DTExp
于 2009-02-05T19:45:14.163 に答える