尝试在C#中编写一个接受以下任何/所有内容的正则表达式:
(这个问题与其他类似的问题有些不同,因为这是一个单词,采用mm / dd / yyyy格式。只需要模式而不需要验证它的可能性。即99/99/9999好的)
我无处可去。这就是我得到的(只承认02/01/1968):
Regex regex = new Regex(@"^\d{2}/\d{2}/\d{4}$",RegexOptions.IgnorePatternWhitespace);
Match x = regex.Match(birthdate);
if (x.Success == false) return;
感谢您的帮助。 (对正则表达式的解释将非常受欢迎)。
答案 0 :(得分:7)
如评论中所述,使用日期时间解析器。要获得正确的正则表达式(仅返回有效的日期时间)可能非常复杂且难以维护。
var formats = new[] { "d/M/yyyy", "dd/M/yyyy", "d/MM/yyyy", "dd/MM/yyyy" };
DateTime dt;
if (DateTime.TryParseExact(input, formats, null, DateTimeStyles.None, out dt))
{
//parsed correctly
}
BTW:您的问题不清楚是否需要dd/mm
或mm/dd
,我选择了第一个
答案 1 :(得分:3)
如果您必须使用正则表达式验证格式,请在范围量词中定义{min,max}
:
^\d{1,2}/\d{1,2}/\d{4}$
答案 2 :(得分:0)
这是一个正则表达式,用于检查每月正确的天数,包括闰年期间的2月天数:
var reg = new Regex(@"\b(((0?[469]|11)/(0?[1-9]|[12]\d|30)|(0?[13578]|1[02])/(0?[1-9]|[12]\d|3[01])|0?2/(0?[1-9]|1\d|2[0-8]))/([1-9]\d{3}|\d{2})|0?2/29/([1-9]\d)?([02468][048]|[13579][26]))\b", RegexOptions.ECMAScript | RegexOptions.ExplicitCapture);
以这种方式打破正则表达式应该很容易理解:
30天的月份:0?[469]|11
天数最多为30:0?[1-9]|[12]\d|30
31天的月份:0?[13578]|1[02]
天数最高为31:0?[1-9]|[12]\d|3[01]
天数最高为28:0?[1-9]|1\d|2[0-8]
1000年以上(包括2位数年份)的任何一年:[1-9]\d{3}|\d{2}
2月29日:0?2/29
闰年的最后两位数(可被4整除):[02468][048]|[13579][26]
RegexOptions.ECMAScript
非常重要,以确保\d
仅匹配来自英语的0-9位数字。
RegexOptions.ExplicitCapture
消除了对(?:)
答案 3 :(得分:0)
这将起作用:
public static class Date_Regex
{
static string DateRegex = @"\d?[\/|\-|\s]?\d?[\/|\-|\s]\d(\s?)[\/|\-|\s]?\d?(\s?)[\/|\-|\s]\d{4}[\s]?$";
public static string RegexMatches(string content)
{
StringBuilder sb = new StringBuilder();
foreach (Match match in Regex.Matches(content, DateRegex, RegexOptions.Multiline))
{
sb.Append(match.Value + "; ");
}
return sb.ToString();
}
}