ChatGPT解决这个技术问题 Extra ChatGPT

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

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

就像是:

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

可以做到吗?


P
Paweł Gościcki

将 %r 与 x 选项一起使用是执行此操作的首选方法。

请参阅 github ruby style guide 中的此示例

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


要效仿的例子。正则表达式中的注释为可维护性创造了奇迹。
或者使用 / 而不是 %r,因为如果正则表达式不在斜杠之间,rubocop 会抱怨。他们的风格指南也是这样推荐的:github.com/bbatsov/ruby-style-guide#regular-expressions
n
noraj

您需要使用启用 free-spacing mode/x 修饰符。

在你的情况下:

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

可以通过用更详细的解释替换链接来改进此答案。
像这样:regexp = /(\d+)(\d+)/x
M
Montells

您可以使用:

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

这个答案对我的情况很有帮助,但只有在我搜索了 (?x) 的含义并能够添加更多上下文之后。如果更新这个答案以更明确地说明它所说明的内容,我会很好。对于其他感兴趣的人,我发现此处有关 (?on-off) 构造的注释很有帮助:ruby-doc.org/core-1.9.3/Regexp.html#class-Regexp-label-Options
@BenParizek 也许您可以在这里添加一个简短的解释作为评论?
我不是这个主题的专家,但据我所知,这里的大多数答案都是在说同一件事的不同版本。问题是复杂的正则表达式很难阅读。通用答案是:您可以启用自由间距模式以帮助使正则表达式更具可读性。有多种方法可以启用自由间距模式。 1) 您可以在结束分隔符 /myregex/x 之后添加修饰符,2) 您可以使用 (?on-off) 构造 /myregex(?x) with free spacing/ 切换自由间距模式,3) 您可以使用 %r{myregex}x 语法.
K
Kache

我建议不要将正则表达式中间表达式拆分为多个部分:

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 洒在任何地方。拆分正则表达式要快得多,并且可以说更容易阅读和维护。
N
N Djel Okoye
regexp = %r{/^ 
            WRITE 
            EXPRESSION 
            HERE 
          $/}x

请参阅“Explaining entirely code-based answers”。虽然这在技术上可能是正确的,但它并没有解释为什么它可以解决问题或应该是选择的答案。我们应该在帮助解决问题的同时进行教育。