我正在尝试解决 Ruby Quiz book 中的问题 #6。这个问题说我必须创建一个名为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
or 13
。
让数字不在它们之间组合的最佳方法是什么?
- - 编辑
使用组,现在它似乎可以正常工作。无论如何,有没有办法获得代表范围的正则表达式?例如,保留前面的示例:
lucky = Regexp.build(1..12)
"7" =~ lucky # => true
"13" =~ lucky # => false
"0" =~ lucky # => false
"5" =~ lucky # => true
Regexp.build 生成的正则表达式必须匹配 1 到 12 之间的所有值,但不能再匹配了。我一直在网上搜索,我发现以编程方式生成这种正则表达式很复杂。此任务是否有任何具体或预定义的方法?
http://utilitymill.com有一个递归函数来实现这一点,但我认为它有点复杂。