如何匹配字符串中的日期

时间:2015-03-16 12:55:04

标签: javascript regex match

我试图从一个文本块中删除一个日期。据我所知,日期总是与Mar 5, 2015类似(三个字母的月份,没有前导零的一天,四位数的年份)。

然而,文本块更加可变。在大多数情况下,它看起来像这样:

  

我们理解您的旅行计划有时会发生变化。我们不收取更改或取消费用。但是,这家酒店(酒店名称)对我们要求传递的客户施加以下处罚:在东部时间上午11:59((格林威治标准时间05:00)之后取消或更改)(美国和加拿大)) 2015年3月10日入住1晚房间&税收罚款。酒店不会退还任何演出或提早结账。

这是我的尝试(val是包含字符串的变量):

var valDate = val.match("\\\)\\\) on (.*)are");
return valDate[1];

正如你所看到的,我在时区的末尾(我相信它将永远存在于那里,无论EST / PST /等),并且'是'紧接着这个日期。

这很有效......直到我的一家酒店通过以下方式:

  

我们理解您的旅行计划有时会发生变化。我们不收取更改或取消费用。但是,此酒店(酒店名称)对我们要求传递的客户施加以下处罚:取消或在东部时间(美国和加拿大)下午6:00(格林威治标准时间05:00)之前进行的更改) 2015年3月15日入住1晚房间&税收罚款。 2015年3月15日下午6:00((格林威治标准时间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确实是虚弱的(因此这个问题)。我猜这可能是一个更好的方式来梳理日期...我只是不知道如何。

有人能帮助我吗?我会非常感激的!

1 个答案:

答案 0 :(得分:1)

与您提供的描述相符的模式是:

(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+([0-9]|[1-2][0-9]|3[0-1]),\s+\d{4}

Regex101 demo

虽然我确信如果你想捕捉日期,你最好寻找图书馆来做到这一点。这样的库可能不太容易出错,会有不同的日期模式,可能更容易定制。

您可以将群组捕获为this answer节目:

var r = /(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+([0-9]|[1-2][0-9]|3[0-1]),\s+\d{4}/g;
var t = "We understand that sometimes your travel plans change. We do not charge a change or cancel fee. However, this property (Hotel Name) imposes the following penalty to its customers that we are required to pass on: Cancellations or changes made after 11:59 AM ((GMT-05:00) Eastern Time (US & Canada)) on Mar 10, 2015 are subject to a 1 Night Room & Tax penalty. The property makes no refunds for no shows or early checkouts.";
m = r.exec(t);
while (m != null) {
    //do something with m[0]
    alert(m[0]);//example
    m = r.exec(t);
}

JSFiddle