2015-03-27 1 views
6

Регулярное выражение должно соответствовать допустимым датам в строке в формате YYYYMMDD. Например, aaa_20150327_bbb следует сопоставить, но aaa_20150229_bbb не потому, что 2015 год не является високосным годом.Использование регулярного выражения для соответствия формату даты в yyyymmdd

Только год от до необходимо учитывать.

+3

Это не будет можно исключить «2/29», если это не високосный год с регулярным выражением. По крайней мере, не в здравом смысле. После этого вам придется разобрать это. Есть ли проблема с '\ d {8}'? Или, по крайней мере, '20 \ d {2} [01] \ d [0123] \ d'? –

+0

@JoeWang На каком языке вы используете? C++ имеет функциональность для этого встроенного, без использования regex –

+0

ahh ... как re может достичь этого ... просто сделайте 5-минутное исследование того, что будет, позволит вам управлять этой возможностью. – HuStmpHrrr

ответ

9

Всего сумасшествие (лет 0-9999)

Следующая один (на основе this ответа) работает на протяжении многих лет между 0 и 9999.

(?<!\d)(?:(?:(?:1[6-9]|[2-9]\d)?\d{2})(?:(?:(?:0[13578]|1[02])31)|(?:(?:0[1,3-9]|1[0-2])(?:29|30)))|(?:(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))0229)|(?:(?:1[6-9]|[2-9]\d)?\d{2})(?:(?:0?[1-9])|(?:1[0-2]))(?:0?[1-9]|1\d|2[0-8]))(?!\d) 

(проверьте demo)


Общее безумие упрощено (годы 2000-2099)

Если вы хотите, вы можете упростить его для работы только в течение многих лет в период между 2000 и 2099

(?<!\d)(?:(?:20\d{2})(?:(?:(?:0[13578]|1[02])31)|(?:(?:0[1,3-9]|1[0-2])(?:29|30)))|(?:(?:20(?:0[48]|[2468][048]|[13579][26]))0229)|(?:20\d{2})(?:(?:0?[1-9])|(?:1[0-2]))(?:0?[1-9]|1\d|2[0-8]))(?!\d) 

Но как вы можете видеть, что это на самом деле не более просто.

(проверьте demo)


здравомыслящий путь (лет) *

Чтобы сохранить здравомыслие, вы должны придерживаться очень простого регулярного выражения, а затем проверить его с помощью кода.

(20\d{2})(\d{2})(\d{2}) 

(проверьте demo)

0

Мой путь (не нормальный путь)

(((\d{4})(0[13578]|10|12)(0[1-9]|[12][0-9]|3[01]))|((\d{4})(0[469]|11)(0[1-9]|[12][0-9]|30))|((\d{4})(02)(0[1-9]|1[0-9]|2[0-8]))|([0-9][0-9][02468]40229)|([0-9][0-9][02468]80229)|([0-9][0-9][13579]20229)|([0-9][0-9][13579]60229)|([0-9][0-9][02468]00229)) 

С vb.net (более легко понять, я так думаю)

Dim meses31 As String = "((\d{4})(0[13578]|10|12)(0[1-9]|[12][0-9]|3[01]))" 
    Dim meses30 As String = "((\d{4})(0[469]|11)(0[1-9]|[12][0-9]|30))" 
    Dim febrero28 As String = "((\d{4})(02)(0[1-9]|1[0-9]|2[0-8]))" 
    Dim febrero29 As String = "([0-9][0-9][02468]40229)|([0-9][0-9][02468]80229)|([0-9][0-9][13579]20229)|([0-9][0-9][13579]60229)|([0-9][0-9][02468]00229)" 

    Dim patternFecha As String = String.Concat("(", meses31, "|", meses30, "|", febrero28, "|", febrero29, ")") 

 Смежные вопросы

  • Нет связанных вопросов^_^