Я пытаюсь решить проблему №6 из книги Ruby Quiz. Эта проблема говорит, что я должен создать новый метод под названием build()
для класса Regex, в котором, передавая целые числа или диапазоны, он должен генерировать регулярное выражение для определения разрешенных чисел.Как создать регулярные выражения для определения целых чисел и диапазонов?
Например:
lucky = Regexp.build(3, 7)
"7" =~ lucky # => true
"13" =~ lucky # => false
"3" =~ lucky # => true
month = Regexp.build(1..12)
"0" =~ month # => false
"1" =~ month # => true
"12" =~ month # => true
Я разработал багги версию, но она не работает, как ожидалось. Моя проблема заключается в генерации правильного регулярного выражения. Все шаблоны, которые я пробовал в Rubular, не принимают то, что им нужно. Например, для Regexp.build(1, 3, 5)
я получил образец, который выглядит как этот:
/^1|3|5$/
Это работает, и это соответствует 1
, 3
и 5
. Но он также соответствует 15
или 13
.
Каков наилучший способ, чтобы цифры не объединялись между ними?
---- EDIT
Использование групп, теперь, кажется, работает правильно. В любом случае, есть ли способ получить regexp, представляющий диапазон? Например, сохраняя предыдущий пример:
lucky = Regexp.build(1..12)
"7" =~ lucky # => true
"13" =~ lucky # => false
"0" =~ lucky # => false
"5" =~ lucky # => true
Регулярное выражение, порожденный Regexp.build бы, чтобы соответствовать все значения между 1 и 12, но не более. Я искал в Интернете, и я видел, что сложно создать этот тип регулярного выражения программным путем. Есть ли какой-либо конкретный или предопределенный метод для этой задачи?
http://utilitymill.com имеет рекурсивную функцию для достижения этого, но я считаю это довольно сложным.
** Регулярные выражения для сопоставления с шаблоном, не проверяя числовые значения. ** Найдите вероятную строку с регулярным выражением, а затем проверить его числовое значение независимо от вашего языка хоста (Ruby, что угодно). –