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

95

这可能不是你期望的问题!我不想要一个匹配换行符的正则表达式;相反,我想写一个很长的正则表达式,为了可读性,我想将其拆分成多行代码。

类似于:

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

可以做到吗?

5个回答

145

6
可仿效的例子。正则表达式内的注释对于可维护性大有裨益。 - Paul Cantrell
8
或者使用/代替%r,因为如果正则表达式不在斜杠之间,rubocop会发出警告。同时,它们的风格指南也推荐这样做:https://github.com/bbatsov/ruby-style-guide#regular-expressions - ytg
我似乎无法让这个工作,ruby 3.1.2p20。 - Peter DeWeese

61

你需要使用/x修饰符,它启用了自由空格模式

在你的情况下:

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

49
替换链接并提供更详尽的解释可以改善这个答案。 - mkataja
正则表达式 = /(\d+)(\d+)/x - Vlad Hilko

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

对于长字符串,我也会执行同样的操作。


3
我选择了这个答案,而不是其他建议使用/x修饰符的答案,因为我必须到处添加\s。拆分正则表达式更快,而且更容易阅读和维护。 - agressen

3

您可以使用:

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

10
这个回答对我的情况有帮助,但只有在我搜索了(?x)的含义并能够添加更多背景后才生效。如果这个回答更新为更明确地说明它所示意的内容会很好。对于其他感兴趣的人,我在这里找到了关于(?on-off)结构的注释:http://ruby-doc.org/core-1.9.3/Regexp.html#class-Regexp-label-Options。 - Ben Parizek
@BenParizek 或许您可以在此处添加一个简短的评论解释? - Peter Berg
我不是这个话题的专家,但据我所知,这里大部分答案都在说同一件事情的不同版本。问题在于复杂的正则表达式很难阅读。通用的答案是:您可以启用自由空格模式来帮助使正则表达式更易读。有多种方法可以启用自由空格模式。1)您可以在结束定界符“/myregex/”后添加修饰符“x”,2)您可以使用(?on-off)结构沿途切换自由空格模式“/myregex(?x) with free spacing/”,3)您可以使用“%r{myregex}x”语法。 - Ben Parizek

1
regexp = %r{/^ 
            WRITE 
            EXPRESSION 
            HERE 
          $/}x

请参见“完全基于代码的答案解释”。虽然这可能在技术上是正确的,但它并没有解释为什么它可以解决问题或应该被选为答案。我们应该在帮助解决问题的同时进行教育。 - the Tin Man

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