DRY Ruby正则表达式的方法是什么?

3
我有一个正则表达式,用来检查字符串是否符合格式日期、两个或三个点、日期 /\A(\d{1,2}-\d{1,2}-\d{4})...?(\d{1,2}-\d{1,2}-\d{4})\z/ 如您所见,日期匹配组\d{1,2}-\d{1,2}-\d{4}被重复使用。
是否有一种正则表达式本地或通用的Ruby编程方法可以将此组分配给一个变量,然后在正则表达式中使用它,而不是实际的组,从而给出类似于/\A<var>...?<var>\z/的结果?
谢谢!

1
您是指像这样的东西吗: https://dev59.com/rHE95IYBdhLWcg3wi-Yc? - Wiktor Stribiżew
那个太令人困惑了,Roney Michael的答案涵盖了我所需的内容。 - Epigene
在检查了他的答案之后,我仍然认为这些是重复的。此外,你说“两个或三个点”,而Roney Michael使用/\A(#{re1})...?(#{re1})\z/而不是/\A(#{re1})\.{2,3}(#{re1})\z/.匹配任何字符,而\.匹配一个字面上的句号。我不明白为什么要将单个速记字符类添加到字符类中(例如[\w]+,当\w+就足够了)。 - Wiktor Stribiżew
我无法判断问题是否重复,但是点部分是正确的 - 应该使用\.{2,3} - Epigene
2个回答

1

正则表达式的连接操作应该能解决问题。

这里的讨论中可以看到:

irb(main):001:0> re1 = re1 = /[\w]+/
=> /[\w]+/
irb(main):002:0> re2 = /[\d]+/
=> /[\d]+/
irb(main):003:0> re3 = /#{re1}[\s]+#{re2}/
=> /(?-mix:[\w]+)[\s]+(?-mix:[\d]+)/
irb(main):004:0> "Foo 123".match(re3).to_s
=> "Foo 123"

针对您的代码,具体来说:
irb(main):001:0> re1 = /\d{1,2}-\d{1,2}-\d{4}/
=> /\d{1,2}-\d{1,2}-\d{4}/
irb(main):002:0> re2 = /\A(#{re1})...?(#{re1})\z/
=> /\A((?-mix:\d{1,2}-\d{1,2}-\d{4}))...?((?-mix:\d{1,2}-\d{1,2}-\d{4}))\z/

..然后根据需要使用re2。


1
正则表达式串联万岁! - Epigene

1
你可以使用常规的 Ruby 完成它。
date_regex = /\d{1,2}-\d{1,2}-\d{4}/
/\A(#{date_regex})...?(#{date_regex})\z/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接