【问题标题】:Way to DRY ruby regex?干燥红宝石正则表达式的方法?
【发布时间】:2015-04-30 06:26:14
【问题描述】:

我有这个正则表达式来检查字符串的格式是否为 日期、两个或三个点、日期

/\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}是重复的。

是否有一种 regex-native 或通用 ruby​​ 编程方式将此组分配给一个变量,然后在 regex 中使用它,而不是在实际组中使用它,给我类似/\A<var>...?<var>\z/ 的东西?

谢谢!

【问题讨论】:

  • 你的意思是这样的:stackoverflow.com/questions/2268421/… ?
  • 那个太令人困惑了,Roney Michael 的回答涵盖了我所需要的。
  • 在检查了他的答案后,我仍然认为这些是重复的。另外,您说两个或三个点,Roney Michael 使用/\A(#{re1})...?(#{re1})\z/ 而不是/\A(#{re1})\.{2,3}(#{re1})\z/. 匹配任何字符\. 匹配文字句点。而且我不知道将单个速记字符类添加到字符类中(例如,[\w]+\w+ 就足够了)。
  • 我无法判断问题是否重复,但点部分是正确的-应该使用\.{2,3}

标签: ruby regex


【解决方案1】:

正则表达式连接应该可以解决问题。

来自讨论here

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。

【讨论】:

  • 正则表达式连接ftw!
【解决方案2】:

你可以用普通的红宝石做到这一点

date_regex = /\d{1,2}-\d{1,2}-\d{4}/
/\A(#{date_regex})...?(#{date_regex})\z/

【讨论】:

    猜你喜欢
    • 2011-06-05
    • 2022-06-23
    • 2016-12-14
    • 2019-04-22
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多