【问题标题】:Regular expression to extract dates from a string [duplicate]从字符串中提取日期的正则表达式[重复]
【发布时间】:2016-03-26 12:58:04
【问题描述】:

我正在处理一个 C# 项目,我需要从一些字符串中解析和提取一些日期。 这些是我的字符串:

dalle ore 19.30 del 04.02.2016 alle ore 19.30 del 06.02.2016
达勒矿石 19.30 德尔 06.02.2016 阿勒矿石 19.30 德尔 08.02.2016
...

对于每一个我想提取两个日期(例如 04.02.2016 06.02.2016)并保存到两个变量中。接下来我将解析它们以创建两个 DateTime 对象。 现在我正在使用这段代码:

 public static string isdate(string input)
 {
  Regex rgx = new Regex(@"\d{2}.\d{2}.\d{4}");
  Match mat = rgx.Match(input);
  if(mat.Success)
  return mat.ToString();
  else return null;
 }

使用此代码,我可以提取第一个日期,但不能提取第二个日期。如何改进我的正则表达式? 谢谢!

试试下面的代码

        static void Main(string[] args)
        {
            string[] inputs = {
                 "dalle ore 19.30 del 04.02.2016 alle ore 19.30 del 06.02.2016", 
                 "dalle ore 19.30 del 06.02.2016 alle ore 19.30 del 08.02.2016"
                             };

            string pattern = @"(?'hour'\d\d).(?'minute'\d\d)\sdel\s(?'day'\d\d.\d\d.\d\d\d\d)";

            foreach (string input in inputs)
            {
                MatchCollection matches = Regex.Matches(input, pattern);
                foreach (Match match in matches)
                {
                    TimeSpan time = new TimeSpan(int.Parse(match.Groups["hour"].Value), int.Parse(match.Groups["minute"].Value), 0);
                    DateTime date = DateTime.ParseExact(match.Groups["day"].Value, "MM.dd.yyyy", CultureInfo.InvariantCulture);

                    Console.WriteLine("Time : {0}", date.Add(time));
                }
            }
            Console.ReadLine();
        }

好的,jdwend 的解决方案很好,但问题是 HH.mm 和日期之间可能有几个空格和字符。有几次是这种形式:HH:mm del dd.MM.YYYY 但有时是这种形式 dd.MM.YYYY del     dd.MM.YYYY 。您认为仍然可以使用一个正则表达式解析所有数据,还是我必须对字符串进行标记?非常感谢你!

【问题讨论】:

  • 如果日期格式真的是固定的(DD.MM.YYYY),您可以使用Regex rgx = new Regex(@"\d{1,2}\.\d{1,2}\.\d{4}");对其进行扫描(注意您必须转义\.,否则这是一个.,它匹配除换行符之外的所有内容。(regexr.com/3d3fv)
  • 小心,如果它依赖于语言环境 - 那就是正则表达式被抛出窗口! MM/DD/YYYY、YYYY-MM-DD,甚至是 MM.DD.YYYY。你让自己头疼。如果您 100% 确定并确信它将始终是固定日期格式,请不要依赖它。
  • 你的意思是你需要一个代码来获得多个匹配项吗?你的正则表达式matches all the dates
  • 我编辑了帖子,因为有人在没有测试解决方案的情况下错误地将这个帖子标记为重复。这个问题很简单,因为 TimeSpan 和 DateTime 的解析不喜欢“hh.mm”格式。它认为句点是分/秒分隔符。
  • 好的,jdwend 的解决方案很好,但问题是 HH.mm 和日期之间可能有几个空格和字符。有几次是这种形式:HH:mm del dd.MM.YYYY 但有时是这种形式 dd.MM.YYYY del     dd.MM.YYYY 。您认为仍然可以使用一个正则表达式解析所有数据,还是我必须对字符串进行标记?非常感谢你!

标签: c# regex


【解决方案1】:

您的正则表达式很好,但您只检索 first 匹配项。要获取所有匹配项,请使用 Matches 而不是 Match

private static final Regex dateRegex = new Regex(@"\d{2}.\d{2}.\d{4}");

public static IEnumerable<string> ExtractDates(string input)
{
     return from m in dateRegex.Matches(input).Cast<Match>()
            select m.Value.ToString();
}

注意事项:

  • 由于 Regex 对象是线程安全且不可变的,因此您无需每次都重新构建它。您可以将其安全地存储在静态变量中。

  • 由于Matches 方法早于.NET 泛型,我们需要调用Cast&lt;Match&gt; 将结果集合转换为IEnumerable&lt;Match&gt;,以便我们可以使用LINQ。

【讨论】:

    猜你喜欢
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多