C# 从字符串中提取日期的正则表达式

C# 从字符串中提取日期的正则表达式,c#,regex,C#,Regex,我正在做一个C项目,我需要从一些字符串中解析和提取一些日期。 这些是我的弦: 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 对于每一个,我想提取两个日期,例如2016年2月4日和2016年2月6日,并保存为两个变量。接下来,我将解析它们以创建两个DateTime对象。 现在我使用以下代码: pub

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

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

对于每一个,我想提取两个日期,例如2016年2月4日和2016年2月6日,并保存为两个变量。接下来,我将解析它们以创建两个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。您认为还是可以用一个regexp解析所有数据,还是必须对字符串进行标记化?非常感谢你

正则表达式很好,但只检索第一个匹配项。要获取所有匹配项,请使用匹配项而不是匹配项:

注:

由于正则表达式对象是线程安全且不可变的,所以不需要每次都重新构建它。您可以将其安全地存储在静态变量中

由于Matches方法早于.NET泛型,因此我们需要使用Cast调用将结果集合强制转换为IEnumerable,以便使用LINQ


如果日期格式确实是固定的DD.MM.YYYY,则可以使用Regex rgx=new Regex@\d{1,2}\.\d{1,2}\.\d{4};请注意,您必须避开\。否则,这是一个错误。除了换行符外,其他都匹配。小心,如果它依赖于语言环境,那么这就是被抛出窗口的正则表达式!年/月/日,年-月-日,甚至年/月/日。你让自己头疼。如果您100%确信它将始终是固定日期格式,请不要依赖它。您的意思是需要一个代码来获取多个匹配项吗?你的正则表达式。我编辑了帖子,因为有人在未测试解决方案的情况下错误地将此帖子标记为副本。这个问题很简单,因为TimeSpan和DateTime的解析不喜欢hh.mm格式。它认为周期是分/秒分隔符。好的,jdwend的解决方案很好,但问题是HH.mm和日期之间可能有几个空格和字符。多次采用这种形式:HH:mm del dd.mm.YYYY,但有时采用这种形式dd.mm.YYYY del dd.mm.YYYY。您认为还是可以用一个regexp解析所有数据,还是必须对字符串进行标记化?非常感谢你!
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();
}