下面列出了已知格式
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。
答案 0 :(得分:6)
我对正则表达式一无所知,但DateTime.TryParseExact
有一个overload,它将格式作为字符串数组。
您可以轻松提供所有格式,并尝试将您的字符串与其中一种匹配。
顺便说一下,mm
specifier是几分钟,MM
specifier是几个月,如果你试着提及几个月。
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
}
答案 1 :(得分:2)
行。我把问题分成了两个
我使用正则表达式来识别模式如下,然后使用DateTime.TryParseExact来验证和提取Soner建议的日,月和年。
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");
}
}
答案 2 :(得分:0)
这是有效的:
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);