红宝石正则表达式,分裂成多行

时间:2012-12-03 19:58:45

标签: ruby regex

  

可能重复:
  Split Ruby regex over multiple lines

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

有一种简单的方法吗?

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

3 个答案:

答案 0 :(得分:3)

您需要使用/x修饰符,表示自由间距模式。更多关于此http://www.regular-expressions.info/freespacing.html

答案 1 :(得分:1)

我可以想出三种让你的代码更具可读性的方法。使用:

  1. /x修饰符,并使用#添加评论。
  2. 使用(?#comment_here)修饰符的内联注释。
  3. 命名组;例如:(?<year>\d{2,4})可用于后续反向引用或操纵值。
  4. 更多信息: http://www.ruby-doc.org/core-1.9.3/Regexp.html

答案 2 :(得分:0)

除了使用其他答案中提到的/x,创建正则表达式,然后逐步组合它们允许您从小的原子大小的片段开始,然后慢慢增长正则表达式。您将看到一些巨大的模式,例如用于解析电子邮件地址,互联网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

RE_PARAMETERS解析为:

/(?:;(?-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