如何使用C#regex匹配各种日期格式并获得日期、月份和年份?
下面列出了已知的格式如何使用C#regex匹配各种日期格式并获得日期、月份和年份?,c#,regex,datetime,C#,Regex,Datetime,下面列出了已知的格式 dd/mm/yyyy (01/01/2015) d/m/yyyy (1/1/2015) dd/mm/yy (01/01/15) d/m/yy (1/1/15) 其他变体将使用破折号(-)、点(.)或空格作为字段分隔符 我正在考虑为每个模式创建一个正则表达式以保持其可维护性,但不确定是否有更好的解决方案。如果有更好的解决方案,请分享 更新: 日期是大文本的一部分,在从文本中提取可能的日期列表之前,我不能使用DateTime.TryParseExact。我不了解正则表达式,但
dd/mm/yyyy (01/01/2015)
d/m/yyyy (1/1/2015)
dd/mm/yy (01/01/15)
d/m/yy (1/1/15)
其他变体将使用破折号(-)、点(.)或空格作为字段分隔符
我正在考虑为每个模式创建一个正则表达式以保持其可维护性,但不确定是否有更好的解决方案。如果有更好的解决方案,请分享
更新:
日期是大文本的一部分,在从文本中提取可能的日期列表之前,我不能使用DateTime.TryParseExact。我不了解正则表达式,但,
DateTime。TryParseExact
具有一个将格式作为字符串数组的数组
您可以轻松地提供所有格式,并尝试您的字符串是否匹配其中一种格式
顺便说一下,是几分钟,是几个月,如果你试着提到几个月
string s = "";
var formats = new string[]
{
"dd/MM/yyyy",
"d/M/yyyy",
"dd/mm/yy",
"d/m/yy",
"dd-MM-yyyy",
"d-M-yyyy",
"dd-MM-yy",
"d-M-yy",
"dd.MM.yyyy",
"d.M.yyyy",
"dd.MM.yy",
"d.M.yy",
"dd MM yyyy",
"d M yyyy",
"dd MM yy",
"d M yy",
};
DateTime dt;
if (DateTime.TryParseExact(s, formats, CultureInfo.InvariantCulture,
DateTimeStyles.None, out dt))
{
// Your string is matched one of first successfull match
}
嗯。我把这个问题一分为二
- 识别字符串中的日期模式并提取匹配的字符串
- 验证已识别的日期模式,然后提取日期、月份和年份
var datePatternRegex = new Regex(@"\b\d{1,2}(/|-|.|\s)\d{1,2}(/|-|.|\s)(\d{4}|\d{2})");
var testData = new []{
"This is test1 10/10/1012 data",
"This is test2 1/1/1012 data",
"This is test3 10-10-1012 data",
"This is test4 1-1-1012 data",
"This is test5 10.10.1012 data",
"This is test6 1.1.1012 data",
"This is test7 10 10 1012 data",
"This is test8 1 1 1012 data",
};
foreach(var data in testData)
{
Console.WriteLine("Parsing {0}", data);
var match = datePatternRegex.Match(data);
if(match.Success)
{
var result = match.Groups[0];
Console.WriteLine(result.Value);
}
else
{
Console.WriteLine("No Match");
}
}
这是有效的:
string input = "01/01/2015";
Regex regex = new Regex(@"(?<day>(3[0-1]|[0-2]\d|\d))/(?<month>(1[0-2]|0\d|\d))/(?<year>([1-2]\d{3}|\d{2}))");
Match match = regex.Match(input);
string year = match.Groups["year"].Value;
string month = match.Groups["month"].Value;
string day = match.Groups["day"].Value;
Trace.WriteLine(match.Groups["year"].Value);
Trace.WriteLine(match.Groups["month"].Value);
Trace.WriteLine(match.Groups["day"].Value);
string input=“01/01/2015”;
正则表达式Regex=newregex(@“(?(3[0-1]|[0-2]\d |\d))/(?(1[0-2]|0\d |\d))/(?([1-2]\d{3}\d{2}));
匹配=正则表达式匹配(输入);
字符串year=match.Groups[“year”].Value;
字符串month=match.Groups[“month”].Value;
字符串day=match.Groups[“day”].Value;
Trace.WriteLine(match.Groups[“year”].Value);
Trace.WriteLine(匹配.Groups[“月”].Value);
Trace.WriteLine(match.Groups[“day”].Value);
我建议您尝试使用regex-hero:您使用的是MVC Razor?在html5中可能有重复的输入类型datetime可用。。它可以处理所有可能的日期格式Hanks Soner。但这不符合我的要求,因为日期将是一个大文本的一部分,在使用TryParseExact方法之前,我需要先确定可能的日期列表。@Mani您没有机会拆分这个大字符串以获得这些值吗?没有,因为日期可以出现在我正在分析的字符串中的任何位置。这就是为什么我想用正则表达式来匹配各种日期模式。