2013-12-24 3 views
-3

Пожалуйста, помогите мне, почему это регулярное выражение не работает, когда дело доходит до даты 20 лет. Но это работает, если я беру дату отдельно как отдельное Regex.thanks в Advance.Java regex yyyymmdd validation

String regex = "^(0?[1-9]|[12][0-9]|3[01])?" ; 
checkRegex("02", regex); 
checkRegex("22", regex); 
checkRegex("20", regex); 

String regex1 = "^(((19\\d\\d)|([2-9]\\d\\d\\d))\\d\\d)(0?[1-9]|1[012])(0?[1-9]|[12][0-9]|3[01])?" ;  

checkRegex("19990802", regex1); 
checkRegex("19990822", regex1); 
checkRegex("19990820", regex1); 

Выход:

02::::^(0?[1-9]|[12][0-9]|3[01])?::::true 
22::::^(0?[1-9]|[12][0-9]|3[01])?::::true 
20::::^(0?[1-9]|[12][0-9]|3[01])?::::true 
19990802::::^(((19\d\d)|([2-9]\d\d\d))\d\d)(0?[1-9]|1[012])(0?[1-9]|[12][0-9]|3[01])?::::true 
19990822::::^(((19\d\d)|([2-9]\d\d\d))\d\d)(0?[1-9]|1[012])(0?[1-9]|[12][0-9]|3[01])?::::true 
19990820::::^(((19\d\d)|([2-9]\d\d\d))\d\d)(0?[1-9]|1[012])(0?[1-9]|[12][0-9]|3[01])?::::false 
+0

downvoters Комментарий pls. – sunleo

+0

вы можете найти рабочее регулярное выражение здесь ... http://stackoverflow.com/questions/4766845/yyyymmdd-date-format-regular-expression-to-validate-a-date-in-c-sharp-net , но, как говорится в некотором ответе, не рекомендуется использовать регулярное выражение для этого ... –

+0

, который вы должны настаивать на том, чтобы я не использовал, если он работает. Я буду использовать. Если вам не нравится просто оставить, не пытайтесь найти ошибку в других. Если у вас есть знания, сначала разрешите проблему. Ссылка, которую вы показали, не имеет ничего общего с моей реализацией. – sunleo

ответ

2

Вы, кажется, ожидает 10-значный номер , а не 8- значный один. У вас есть дополнительный \\d\\d в середине вашего выражения.

^(((19\\d\\d)|([2-9]\\d\\d\\d))\\d\\d)(0?[1-9]|1[012])(0?[1-9]|[12][0-9]|3[01])? 
           ^^^^^^ 
           Here 

Обратите внимание, что некоторые 7, 8 и 9-значные числа будут приняты вашим регулярным выражением по двум причинам.

  1. Вы сделали 0 s опциональный в начале месяца, а в начале дня, по пути ? после каждого 0.
  2. Вы сделали этот день необязательным, с помощью ? в конце.
1

попробовать:

String regex1 = [0-9]{4}[0-1][0-9][0-3][0-9] 

Я рекомендую вам использовать:

string date= "19990820"; 
DateTime theTime= DateTime.ParseExact(date, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None);