【发布时间】: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 。您认为仍然可以使用一个正则表达式解析所有数据,还是我必须对字符串进行标记?非常感谢你!