ruby正则表达式,拆分为多行

ruby正则表达式,拆分为多行,ruby,regex,Ruby,Regex,可能重复: 如果我在ruby中有一个很长的正则表达式,我如何将它分成多行以使其更具可读性 有没有一个简单的方法可以做到这一点 line.regexp = /^([^\ ]+) ([^\ ]+) \[(#{timestamp('%d/%b/%Y:%H:%M:%S %z')})?\] (#{ip_address}) ([^\ ]+) ([^\ ]+) (\w+(?:\.\w+)*) ([^\ ]+) "([^"]+)" (\d+) ([^\ ]+) (\d+) (\d+) (\d+)

可能重复:

如果我在ruby中有一个很长的正则表达式,我如何将它分成多行以使其更具可读性

有没有一个简单的方法可以做到这一点

      line.regexp = /^([^\ ]+) ([^\ ]+) \[(#{timestamp('%d/%b/%Y:%H:%M:%S %z')})?\] (#{ip_address}) ([^\ ]+) ([^\ ]+) (\w+(?:\.\w+)*) ([^\ ]+) "([^"]+)" (\d+) ([^\ ]+) (\d+) (\d+) (\d+) (\d+) "([^"]*)" "([^"]*)"/

您需要使用
/x
修饰符,它表示自由间距模式。这里有更多信息。

我可以想出三种方法来提高代码的可读性。使用:

  • 使用
    /x
    修饰符并添加带有
    #
    的注释
  • 使用
    (?#comment_此处)
    修饰符内联注释
  • 命名组;例如:
    (?\d{2,4})
    对于以后的反向引用或操作值非常有用
  • 更多信息:

    除了使用其他答案中提到的
    /x
    之外,创建分段的正则表达式,然后逐渐将它们组合在一起,允许您从原子大小的小片段开始,然后慢慢增长正则表达式。您将看到使用一些巨大的模式来完成此操作,例如用于解析电子邮件地址、internet URL等的模式

    例如,这来自Ruby的OpenURI源代码:

    RE_LWS = /[\r\n\t ]+/n
    RE_TOKEN = %r{[^\x00- ()<>@,;:\\"/\[\]?={}\x7f]+}n
    RE_QUOTED_STRING = %r{"(?:[\r\n\t !#-\[\]-~\x80-\xff]|\\[\x00-\x7f])*"}n
    RE_PARAMETERS = %r{(?:;#{RE_LWS}?#{RE_TOKEN}#{RE_LWS}?=#{RE_LWS}?(?:#{RE_TOKEN}|#{RE_QUOTED_STRING})#{RE_LWS}?)*}n
    

    你能把你的正则表达式贴在这里吗,这样我们就可以实际操作它了?
    /(?:;(?-mix:[\r\n\t ]+)?(?-mix:[^\x00- ()<>@,;:\\"\/\[\]?={}\x7f]+)(?-mix:[\r\n\t ]+)?=(?-mix:[\r\n\t ]+)?(?:(?-mix:[^\x00- ()<>@,;:\\"\/\[\]?={}\x7f]+)|(?-mix:"(?:[\r\n\t !#-\[\]-~\x80-\xff]|\\[\x00-\x7f])*"))(?-mix:[\r\n\t ]+)?)*/n