【问题标题】:How to match date in string如何匹配字符串中的日期
【发布时间】: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


【解决方案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.

【讨论】:

  • 这非常有效 - 非常感谢您的帮助和建议!一个问题:你有两次m = r.exec(t);。不仅第一个是必要的,还是我完全错过了什么?
  • @AaronMickelson:/g 修饰符使您可以遍历所有匹配项。每次仍有匹配可用时,while 循环测试。 js正则表达式引擎以某种方式跟踪rt之上的位置,因此您还需要在while循环中调用它,否则程序将陷入无限循环。
  • 哈哈!知道了。再次感谢!!
猜你喜欢
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
  • 2017-11-04
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
  • 2020-12-19
相关资源
最近更新 更多