Самый простой способ взять regex1 и regex2 и бросить их вместе, как это:
regex1|regex2
Затем, вы можете извлечь взаимные «префиксы» и «суффикса». В вашем случае:
^(\d{4}|d{2})[-/]
и $
Здесь я использую сброс ?|
ветви:
^(\d{4}|\d{2})[-/](?|(0?[1-9]|[12][0-9]|3[01])[-/](0?[1-9]|1[012])$|(0?[1-9]|1[012])[-/](0?[1-9]|[12][0-9]|3[01]))$
Если предположить, что \d
для ваших целей такой же, как [0-9]
, вы можете сократить, что немного:
^(\d{4}|\d{2})[-/](?|(0?[1-9]|[12]\d|3[01])[-/](0?\d|1[012])$|(0?[1-9]|1[012])[-/](0?[1-9]|[12]\d|3[01]))$
Это придерживается ближайшего к вашему первоначальному регистру EXEs.
С другой стороны, вы можете отказаться от проверки. Часть, которая соответствует дню, также будет соответствовать всем месяцам.
Это регулярное выражение:
^(\d{4}|\d{2})[-/](0?[1-9]|[12][0-9]|3[01])[-/](0?[1-9]|[12][0-9]|3[01])$
Если вы не заботитесь о захвате групп (так тривиально расколоть на [-/]
), вы можете использовать:
^(\d{4}|\d{2})([-/](0?[1-9]|[12][0-9]|3[01])){2}$
Это будет соответствовать все в старые регулярные выражения. Недостатком является то, что она также соответствует «даты», как:
2000/31/30
Конечно, кратчайшего регулярное выражение (в разумных пределах, в противном случае это .*
) будет что-то вроде:
^(\d{2}){1,2}([-/]\d{1,2}){2}$
No. Вы не можете , Как конкретно вы планируете рассказать «2016/03/04' и« 2016/04/03 »? Оба они полностью действительны, но 4 марта и 3 апреля не совсем совпадают. ** ТОЛЬКО **, что это может когда-либо срабатывать, если вы запретите что-либо когда-либо происходить в дни 1-12, так что только 13-е-28-е/29-е/30-е/31-е всегда действительны. –
Итак, вы хотите построить условную логику в регулярное выражение, которое будет смотреть на третью \ d \ d в YYYY/MM/DD и попытаться определить, действительно ли это DD или просто MM? Но как пишет @MarcB, как вы узнаете, когда 07 июля или 7? что относительно 1997/07/07. Как вы решаете? –