用户在预订租赁空间时选择一个小时数(作为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
答案 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
。
语义合并功能可以识别重叠并进行合并,文本匹配仅对严格相等的文本有效。