-1

可能重复:
在多行上拆分 Ruby 正则表达式

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

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

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

3 回答 3

3

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

于 2012-12-03T20:04:15.180 回答
1

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

  1. 修饰符并使用./x添加注释#
  2. (?#comment_here)带有修饰符的内联注释。
  3. 命名组;例如:(?<year>\d{2,4})对于之后的反向引用或操作值很有用。

更多信息: http ://www.ruby-doc.org/core-1.9.3/Regexp.html

于 2012-12-03T20:27:19.313 回答
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
于 2012-12-03T21:05:08.810 回答