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