压缩一串时间块;显示日期范围

时间:2019-02-13 15:19:17

标签: regex dart

用户在预订租赁空间时选择一个小时数(作为DateTime对象)。

List<DateTime> dateTimeList = getDateTimeList();

我将该列表转换为可显示的字符串,如下所示:

List<String> hourList = List<String>();

for (DateTime dateTime in dateTimeList) {
  String hour = getHour(dateTime, context); // getHour returns e.g. 14:00 or 2pm
  String nextHour = getHour(dateTime.add(Duration(hours: 1)), context);
  hourList.add(hour + " - " + nextHour);
}

hourList.sort();
return hourList.join(", ");

最终我有以下列表:

10:00 - 11:00
11:00 - 12:00
15:00 - 16:00
16:00 - 17:00
20:00 - 21:00

问:如何进行压缩,以便合并连续的块?像这样:

10:00 - 12:00
15:00 - 17:00
20:00 - 21:00

我想到过正则表达式替换和各种for循环,这些循环在我完成之前就变得复杂了……这并不那么复杂:

string = string.replaceAll("- 01:00, 01:00", "");
string = string.replaceAll("- 02:00, 02:00", "");
string = string.replaceAll("- 03:00, 03:00", "");
etc

1 个答案:

答案 0 :(得分:0)

RegExp不能理解文本的含义,只能理解结构,因此通常最好解析文本并使用能理解所发生情况的代码来处理它。

在这种特殊情况下,您的文本结构实际上是如此简单,以至于RegExp可以处理它,因为您正在寻找- xy:zw, xy:zw的x,y,z和w任意数字。

RegExp的一种数学计算是

var repeatedTimeRE = RegExp(r"- (\d\d:\d\d), \1 ");

然后您可以替换do string = string.replaceAll(repatedTimeRE, "");来加入相邻的时间间隔,其中第二个时间与第一个时间完全相同。

如果您的格式不完全符合书面格式,则说一点钟既可以写为“ 1:00”又可以写为“ 01:00”,那么文本匹配会变得更加困难。 如果间隔可以重叠,则RegExp也无法捕获它,例如: 01:00 - 02:00, 01:59 - 02:35。 语义合并功能可以识别重叠并进行合并,文本匹配仅对严格相等的文本有效。