首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >人类可读的时间-下午5时30分,中午12时

人类可读的时间-下午5时30分,中午12时
EN

Stack Overflow用户
提问于 2016-09-29 00:30:32
回答 4查看 418关注 0票数 0

我要分析的一些事情是:

代码语言:javascript
运行
复制
8am, 12.10pm, 5.45pm 
8am, 11.30am
12noon
12 noon
8 am
7 pm. 

我有以下内容,但没有为中午提供餐饮服务--但它并没有涵盖上述所有案例。

代码语言:javascript
运行
复制
^([0-9]|0[0-9]|1[0-9]|2[0-3]).[0-5][0-9][a|p]m$
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-09-29 01:36:04

验证应该在regex之外进行,因为它不是基于语义的,而是基于我们对时间的理解。虽然我们可以在正则表达式中做到这一点,但它会使模式变得非常混乱。

这种模式的基本形式应该是这样,简单而直接:

代码语言:javascript
运行
复制
\d{1,2}(\.\d{1,2})? ?([a|p]m|noon)

但是,我们将不得不添加一些命名的组来隔离不同的时间:

  1. 小时数:(?<hours>\d{1,2})
  2. 会议记录:(?<minutes>\d{1,2})
  3. 期间:(?<period>[ap]m|noon)

合并所有togather:@"(?<hours>\d{1,2})(\.(?<minutes>\d{1,2}))? ?(?<period>[ap]m|noon)"

下面的代码捕获字符串中看起来像人类可读的时间的所有部分,只是在示例中找到的部分,并将其解析为TimeSpan对象:

代码语言:javascript
运行
复制
var times = Regex.Matches(input, @"(?<hours>\d{1,2})(\.(?<minutes>\d{1,2}))? ?(?<period>[ap]m|noon)")
    .Cast<Match>()
    // parse parts of time
    .Select(m => new
    {
        Hours = int.Parse(m.Groups["hours"].Value),
        Minutes = m.Groups["minutes"].Success ? int.Parse(m.Groups["minutes"].Value) : 0,
        IsAfternoon = Regex.IsMatch(m.Groups["period"].Value, "pm|noon"),
    })
    // filter out invalid time
    .Where(x => x.Hours <= 12 && x.Minutes <= 59)
    // convert
    .Select(x => new TimeSpan((x.Hours + (x.IsAfternoon ? 12 : 0)) % 24, x.Minutes, 0));

编辑:我们有一种奇怪的方式记录时间:下午1点= 13:00,下午2点= 14:00,.11 2pm = 23:00,12 2pm= 24:00 (但= 12:00)。而且,上面的例子没有考虑到这一点。

所以这里有个解决办法:

代码语言:javascript
运行
复制
var input = @" Monday 8am, 12.10pm, 5.45pm, 14:24||8:0|0:10|17:45";
var results = Regex.Matches(input, @"(?<hours>\d{1,2})([\.:](?<minutes>\d{2}))?(?<period>[ap]m|noon)?")
    .Cast<Match>()
    .Where(m => m.Groups["minutes"].Success || m.Groups["period"].Success)
    .Select(m => new
    {
        Hours = int.Parse(m.Groups["hours"].Value),
        Minutes = m.Groups["minutes"].Success ? int.Parse(m.Groups["minutes"].Value) : 0,
        IsAfternoon = m.Groups["period"].Success ? Regex.IsMatch(m.Groups["period"].Value, "pm|noon") : (bool?)null
    })
    .Dump()
    .Where(x => (x.IsAfternoon != null ? x.Hours <= 12 : x.Hours < 24) && x.Minutes <= 59)
    .Select(x => new TimeSpan(
        x.Hours == 12 && x.IsAfternoon == true
            ? 12 
            : x.Hours + (x.IsAfternoon == true ? 12 : 0),
        x.Minutes,
        0));

结果:

上午8:00 12:10:00 下午5:45:00 14:24:00 00:10:00 下午5:45:00

票数 1
EN

Stack Overflow用户

发布于 2016-09-29 10:07:13

如果你想像你在最初的问题中所说的那样使用动量,你可以:

  • 自定义地区以解析“中午”,就像pm一样
  • 使用多格式的矩分析

您可以使用moment.updateLocale指定meridiemParseisPM,如文档中所述。

然后可以使用多格式矩分析指定所需的所有格式(在示例中为['ha', 'h a', 'h.mma'])。

以下是问题中所提供的输入的工作示例:

代码语言:javascript
运行
复制
moment.updateLocale('en', {
  meridiemParse : /[ap]\.?m?\.?|noon/i,
  isPM : function (input) {
    input = (input + '').toLowerCase();
    return input[0] === 'p' || input === 'noon';
  }
});

var arr = ['8am', '12.10pm', '5.45pm', '11.30am', '12noon', '12 noon', '8 am', '7 pm.'];

for(var i=0; i<arr.length; i++){
  var m = moment(arr[i], ['ha', 'h a', 'h.mma'], true);
  console.log(m.format('HH:mm'), arr[i]);
}
代码语言:javascript
运行
复制
<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.15.1/moment.min.js"></script>

票数 1
EN

Stack Overflow用户

发布于 2016-09-29 10:53:22

我希望这一切都能做到:)这是对你自己尝试的一个小小的修改。

代码语言:javascript
运行
复制
(?<![\d.])                              # Mustn't be preceeded by a digit or .
    (?:
        12\s*noon                       # just 12 noon
    |    
        (?:[0-9]|0[0-9]|1[0-2])         # 12 hour clock
        (?:\.[0-5][0-9])?               # optional minutes
        \s*(?:[ap]m)                    # mandatory am/pm
    |
        (?:[0-9]|0[0-9]|1[0-9]|2[0-3])  # 24 hour clock
        (?:\.[0-5][0-9])?               # optional minutes
    )
(?![\d.]|[ap]m)                         # Correct ending

在regex101这里看看

PS。您已经将其标记为c#,因此我假设后面的查找是可以的。(还有momentjs标签,这让我很不确定。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39759578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档