2016-09-28 2 views
0

Поэтому у меня есть поле даты (YYYY/DD/MM)Сменная Regex поле

^((\d{4}|\d{2})[-/](0?[1-9]|[12][0-9]|3[01])[-/])(0?[1-9]|1[012])$ 

И

(YYYY/MM/DD)

^(\d{4}|d{2})[-/](0?[1-9]|1[012])[-/](0?[1-9]|[12][0-9]|3[01]))$ 

мне было интересно, если я может сделать части DD и MM взаимозаменяемыми, чтобы я не представлял их отдельно. Я знаю, что могу использовать функцию OR после YYYY, но мне действительно хотелось бы иметь регулярное выражение, которое может захватывать оба формата в кратчайшем шаблоне.

+0

No. Вы не можете , Как конкретно вы планируете рассказать «2016/03/04' и« 2016/04/03 »? Оба они полностью действительны, но 4 марта и 3 апреля не совсем совпадают. ** ТОЛЬКО **, что это может когда-либо срабатывать, если вы запретите что-либо когда-либо происходить в дни 1-12, так что только 13-е-28-е/29-е/30-е/31-е всегда действительны. –

+0

Итак, вы хотите построить условную логику в регулярное выражение, которое будет смотреть на третью \ d \ d в YYYY/MM/DD и попытаться определить, действительно ли это DD или просто MM? Но как пишет @MarcB, как вы узнаете, когда 07 июля или 7? что относительно 1997/07/07. Как вы решаете? –

ответ

0

Самый простой способ взять 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}$ 
Смежные вопросы