在多行上拆分Ruby正则表达式

Cho*_*ett 66 ruby regex code-formatting

这可能不是你期待的问题!我不想要一个匹配换行符的正则表达式; 相反,我想写一个长的正则表达式,为了便于阅读,我想分成多行代码.

就像是:

"bar" =~ /(foo|
           bar)/  # Doesn't work!
# => nil. Would like => 0
Run Code Online (Sandbox Code Playgroud)

可以吗?

mth*_*ley 111

使用带有x选项的%r是首选方法.

从github ruby​​样式指南中查看此示例

regexp = %r{
  start         # some text
  \s            # white space char
  (group)       # first group
  (?:alt1|alt2) # some alternation
  end
}x

regexp.match? "start groupalt2end"
Run Code Online (Sandbox Code Playgroud)

https://github.com/styleguide/ruby

  • 或者使用/而不是%r,因为如果正则表达式不在斜杠之间,rubocop会抱怨.他们的风格指南也是这样推荐的:https://github.com/bbatsov/ruby-style-guide#regular-expressions (7认同)
  • 要遵循的例子.正则表达式中的注释可以保持可维护性. (5认同)

Sil*_*ost 46

您需要使用/x修改器,它启用自由间距模式.

  • 通过用更详细的解释替换链接可以改善这个答案. (47认同)

Kac*_*che 5

我建议不要切割正则表达式中间表达式,而是将其分成几部分:

full_rgx = /This is a message\. A phone number: \d{10}\. A timestamp: \d*?/

msg = /This is a message\./
phone = /A phone number: \d{10}\./
tstamp = /A timestamp: \d*?/

/#{msg} #{phone} #{tstamp}/
Run Code Online (Sandbox Code Playgroud)

我对长字符串也做同样的事情。

  • 我选择了这个答案,而不是其他人推荐的“/x”修饰符,因为我必须在各处撒上“\s”。分解正则表达式要快得多,并且可以说更容易阅读和维护。 (3认同)