【问题标题】:Correct Regex to extract date times out of expression like this正确的正则表达式从这样的表达式中提取日期时间
【发布时间】:2016-11-02 04:49:47
【问题描述】:

简而言之,我要做的是使以下测试成功

    [TestMethod]
    public void DateTimeFormatTest()
    {
        string text = "jose23 (11/1/2016 11:27pm, 8 posts)";
        var matches = BoardScanner.DateTimeFormat.Matches(text);
        Assert.AreEqual(matches.Count, 1, String.Format("Couldn't extract date from {0} using DateTimeFormat", text));
        var match = matches[0];
        try
        {
           DateTime.Parse(match.Value);
        }
        catch(FormatException)
        {
            Assert.Fail("Couldn't convert {0} to DateTime object", match.Value);
        }
    }

我使用的正则表达式是

new Regex(@"\d{2,2}/\d{2,2}/\d{4,4} \d{2,2}:\d{2,2}/^(am|pm|AM|PM)")

显然不工作

【问题讨论】:

  • 如果模式始终相同,string dtprt = text.Split('(')[1].ToString().Split(',')[0].ToString(); 也可以提取您的日期。比如日期总是在(和,之间

标签: c# regex string datetime


【解决方案1】:

它不起作用,因为:

  • 在正则表达式中,正斜杠需要用反斜杠转义。
  • 月份和日期可以是 1 位或 2 位数字,但您要明确在这些区域中查找正好 2 位数字。
  • ^ 字符代表字符串的开头,所以在你的模式中间,无论你检查的是什么,它都会导致你的匹配失败(至少取决于你的标志)。

以下模式适用于您提供的输入:

\d{1,2}\/\d{1,2}\/\d{4} \d{1,2}:\d{2}(am|pm|AM|PM)

【讨论】:

  • 有没有办法让我做一个不区分大小写的 am|pm 而不是写 am|pm|AM|PM?
  • @DeadlyNicotine 您可以使用i 标志使您的正则表达式搜索不区分大小写。
猜你喜欢
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 2020-09-21
  • 2020-08-11
  • 2017-05-13
  • 2011-02-18
  • 1970-01-01
相关资源
最近更新 更多