将Ruby正则表达式拆分为多行


78

这可能不是您期望的问题!我不希望能在换行符上匹配的正则表达式;相反,我想编写一个长的正则表达式,出于可读性考虑,我想拆分成多行代码。

就像是:

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

能做到吗

Answers:



123

最好将%r与x选项一起使用。

请参阅github ruby​​样式指南中的示例

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

regexp.match? "start groupalt2end"

https://github.com/github/rubocop-github/blob/master/STYLEGUIDE.md#regular-expressions


5
下面的示例。正则表达式中的注释确实为可维护性带来了奇迹。
Paul Cantrell

8
或使用/而不是%r,因为rubocop会抱怨正则表达式是否在斜线之间。也是他们的风格指南,建议这样:github.com/bbatsov/ruby-style-guide#regular-expressions
ytg

3

您可以使用:

"bar" =~ /(?x)foo|
         bar/

8
这个答案对我的情况很有帮助,但是只有在我搜索了(?x)的含义并能够添加更多上下文之后,该答案才有用。如果将此答案更新为更清楚地说明其含义,我将非常高兴。对于其他感兴趣的人,我发现此处有关(?on-off)构造的注释很有帮助:ruby-doc.org/core-1.9.3/Regexp.html#class-Regexp-label-Options
Ben Parizek

@BenParizek也许您可以在此处添加简短说明作为评论?
彼得·伯格

我不是这个主题的专家,但据我了解,这里的大多数答案都说同一件事的不同版本。问题是复杂的正则表达式很难阅读。通用答案是:您可以启用自由间隔模式以帮助使正则表达式更具可读性。您可以通过多种方式启用自由间隔模式。1)您可以在结束定界符之后添加修饰符/myregex/x,2)您可以使用(?on-off)构造一路切换自由间距模式/myregex(?x) with free spacing/,3)您可以使用%r{myregex}x语法。
本·帕里塞克

1

我建议不要将正则表达式的中间表达切成小段:

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}/

对于长字符串,我也是如此。


我选择了这个答案,而不是其他人推荐的/x修饰剂,因为我不得不\s到处撒些东西。分解正则表达式要快得多,并且可以说更易于阅读和维护。
6
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.