Вы делаете ошибку, которую, кажется, совершают многие люди (посмотрите на активность в этом теге!): У вас есть цель (в данном случае проверка возраста), и вы решили , что онадолжно быть достигнуто с помощью регулярных выражений.Я не совсем уверен, почему люди делают это - это не так, как регулярное выражение - волшебная панацея, которая решит все ваши проблемы.Лучший вопрос: (а) «Как мне выполнить проверку возраста? Я подумал, может быть, регулярное выражение, но я не уверен, как написать один», или (б) «Я использую технологиюXYZ, и мне нужно выполнить проверку возраста, потому что XYZ структурирован в виде PQR, мне нужно использовать для этого регулярное выражение, но я не уверен, как его написать. "
Так что если выв ситуации (а) я бы сказал так: зачем использовать регулярное выражение?Я не уверен, как вы получаете свой вклад, но, кажется, есть два случая.Если вы получаете одно целочисленное значение для того, сколько им лет, просто прочитайте его откуда угодно, конвертируйте в целое число ( например , через Java Integer.parseInt(myStringInput)
), а затемпроверьте, что целое число находится в диапазоне с чем-то вроде return (18 < age) ? true : false
.Если вы получаете дату их рождения (как подразумевается под «годами, месяцами и днями»), то: читайте по годам, месяцам и дням;преобразовать их в целые числа;используйте их для создания экземпляра класса Date
;и используйте его методы для измерения расстояний между временами (опять же, это зависит от вашего языка).
Если, с другой стороны, вы находитесь в ситуации (б) ... тьфу.Да, это было бы отвратительно.Если вы находитесь в ситуации с одним целым числом, это должно быть выполнимо.Если вы хотите соответствовать, скажем, возрастам больше или равным 18, вы должны сделать что-то вроде ^(1[8-9]|[2-9]\d|\d{3,})$
: либо 18, 19, любой возраст из двух цифр выше подросткового возраста, или возраст из трех или более цифр.Если вы хотите соответствовать до 18 лет, то вам нужно ^(\d|1[0-7])$
.Если вы находитесь в ситуации рождения ребенка, хотя ... опять, тьфу.Я не уверен, как бы я подошел к этому.Я надеюсь, что нет.Это определенно выполнимо;Я думаю, что правильный подход заключается в том, чтобы сделать что-то подобное вышеописанному.Сопоставьте все годы, которые были до now-18
;если год равен now-18
, делайте что-то подобное месяцами;и если месяц совпадает, сделайте что-то похожее для дней.Но я надеюсь, что вы не находитесь в такой ситуации.
Редактировать 1: Вы сказали, что написали какую-то структуру проверки для полей, которые предполагали регулярное выражение.Хотя я понимаю, почему это заставит вас хотеть их использовать, это ограничит то, что вы можете проверить (и определенно то, что вы можете проверить разумно).Возможно, имеет смысл вместо этого передать функцию обратного вызова, которая позволит вам иметь дело с регулярным выражением или с такими вещами.