【问题标题】:Match a pattern with a string and extract information将模式与字符串匹配并提取信息
【发布时间】:2016-04-19 08:30:37
【问题描述】:

我正在编写 Google Apps 脚本。我希望用户输入类似的模式 MM/DD/YYYY hh:mm:ss

根据我想从字符串中提取信息的模式。该字符串类似于02/29/2016 07:00:00 PM EST。我想使用用户给出的模式从这个时间戳字符串中提取日期、月份、年份、小时、分钟和秒。

如何在 JavaScript 中实现这一点?

【问题讨论】:

  • @Mr_Green 感谢您的回答,但您没有收到我的问题。时间戳可能采用 new Date() 可能无法识别的格式,因此我不想使用 new Date()
  • @HariDas 这种格式的任何例子?即使如此,我仍然认为您应该将无效格式设置为更正格式并仅使用new Date()
  • @Mr_Green new Date("02/29/2016 07:00:00 EST").getMinutes() 给出了 30(可能是因为时区),这不是预期的。
  • @Mr_Green new Date("02/29/2016 07:00:00 PM EST").getUTCHours() 给出了预期的 0。我错过了什么吗?
  • 看来你是在解析器之后,GitHub 上已经有很多了。

标签: javascript regex date google-apps-script


【解决方案1】:

您可以试试这个示例(在 Google 应用程序脚本中):

var a = extractDateTimeInfo('MM/DD/YYYY hh:mm:ss', '02/29/2016 07:10:14 PM EST');
Logger.log(a);  //output: Year: 2016, month: 02, date: 29, hours: 07, min: 10, sec: 14

var b = extractDateTimeInfo('YYYY-MM-DD hh:mm', '2016-12-26 16:13 PM EST');
Logger.log(b);  //output: Year: 2016, month: 12, date: 26, hours: 16, min: 13, sec: 


function extractDateTimeInfo(patt, t) {
  var YYYYPos = patt.indexOf('YYYY');
  var MMPos = patt.indexOf('MM');
  var DDPos = patt.indexOf('DD');
  var hhPos = patt.indexOf('hh');
  var mmPos = patt.indexOf('mm');
  var ssPos = patt.indexOf('ss');

  var YYYY = YYYYPos >= 0 ? t.substr(YYYYPos, 4) : '';
  var MM = MMPos >= 0 ? t.substr(MMPos, 2) : '';
  var DD = DDPos >= 0 ? t.substr(DDPos, 2) : '';
  var hh = hhPos >= 0 ? t.substr(hhPos, 2) : '';
  var mm = mmPos >= 0 ? t.substr(mmPos, 2) : '';
  var ss = ssPos >= 0 ? t.substr(ssPos, 2) : '';
  return Utilities.formatString("Year: %s, month: %s, date: %s, hours: %s, min: %s, sec: %s", YYYY, MM, DD, hh, mm, ss);
}

但是我不知道您期望用户给出什么类型的模式。但是您可以将其调整为其他可能性,例如 YY 等。

您也可以在 extractDateTimeInfo 函数中将结果放入数组中...

【讨论】:

    【解决方案2】:

    这个正则表达式可以工作(但不检查用户输入的值是否有效)

    (\d+)\/(\d+)\/(\d+)\s+(\d+):(\d+):(\d+)
    

    Regex Demo

    JS 代码

    var re = /(\d+)\/(\d+)\/(\d+)\s+(\d+):(\d+):(\d+)/; 
    var str = '02/29/2016 07:00:00 PM EST';
    
    var result = str.match(re);
    document.writeln(result[1] + '<br>');
    document.writeln(result[2] + '<br>');
    document.writeln(result[3] + '<br>');
    document.writeln(result[4] + '<br>');
    document.writeln(result[5] + '<br>');
    document.writeln(result[6] + '<br>');

    Ideone Demo

    【讨论】:

      【解决方案3】:

      试试这个:

      /^(0?\d|1[0-2])\/([0-2]?\d|3[01])\/(\d{1,4})\s([01]?\d|2[0-3]):([0-5]?\d):([0-5]?\d)$/
      

      我能做的最多的就是限制输入:
      第 1 组:月份,限制为 0 到 12
      第 2 组:天数,从 0 到 31
      第 3 组:年份,限制为 4 个字符

      第 4 组:小时,限制在 0 到 23
      第 5 组:分钟,限制在 0 到 59
      第 6 组:秒,限制在 0 到 59

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-25
        • 1970-01-01
        • 1970-01-01
        • 2018-11-03
        • 2011-12-10
        • 2019-05-27
        • 2012-04-01
        • 1970-01-01
        相关资源
        最近更新 更多