【发布时间】:2015-03-16 12:55:04
【问题描述】:
我正在尝试从一段文本中梳理出日期。据我所知,日期总是类似于Mar 5, 2015(三个字母的月份,没有前导零的日期,四位数的年份)。
然而,文本块的变化更大。在大多数情况下,它通常看起来像这样:
我们了解您的旅行计划有时会发生变化。我们不收取更改或取消费用。但是,这家酒店(酒店名称)对其客户施加以下我们必须转嫁的罚款: 3 月 3 日上午 11:59(格林威治标准时间(GMT-05:00)东部时间(美国和加拿大))之后取消或更改2015 年 10 月 10 日起需支付 1 晚房费和税费。对于未入住或提前退房,住宿不予退款。
这是我的尝试(val 是包含字符串的变量):
var valDate = val.match("\\\)\\\) on (.*)are");
返回 valDate[1];
如您所见,我选择了两个 )) 在时区末尾(我相信无论 EST/PST/等如何)和紧随日期之后的“是”。
这运行得非常好......直到我的一家酒店通过了以下:
我们了解您的旅行计划有时会发生变化。我们不收取更改或取消费用。然而,这家酒店(酒店名称)对其客户施加以下我们必须转嫁的罚款:在 3 月 6 日下午 6:00((GMT-05:00)东部时间(美国和加拿大))之前取消或更改2015 年 15 月 15 日将受到 1 晚房费和税款的罚款。在 2015 年 3 月 15 日下午 6:00((GMT-05:00) 东部时间(美国和加拿大))之后取消或更改将收取 1 晚房费和税费。住宿不会因未入住或提前退房而退款。
我的代码返回了:
Mar 15, 2015 are subject to a 1 Night Room & Tax penalty. Cancellations or changes made after 6:00 PM ((GMT-05:00) Eastern Time (US & Canada)) on Mar 15, 2015
这是不太理想的地方。我想我理解为什么会发生这种情况,但是尽管我可能不会修复它,但请尝试一下。此外,我原来的match 无疑是笨拙的(因此出现了这个问题)。我猜可能有更好的方法来梳理日期......我只是不知道如何。
有人可以帮助我吗?我将永远感激不尽!
【问题讨论】:
-
这两个日期应该选哪个?
-
搜索日期字符串怎么样?
[A-Z][a-z]{2}\s[0-3][0-9],\s[0-2][0-9]{3}如果有两个不同的日期,你就很难知道你想要哪一个。 -
使用
(.*?)让你的表达不贪婪...? -
试试这个
[A-Z][a-z]{2} ([1-2][0-9]|[3][0-1])?, \d{4}你当然可以在网上找到更多的防错模式。 -
谢谢大家的帮助! @CommuSoft 的回答(如下)非常适合我正在尝试做的事情。
标签: javascript regex match